//============================================================================================
/**
 * @file	scrcmd.c
 * @brief	スクリプトコマンド用関数
 * @author	Satoshi Nohara
 * @date	05.08.04
 *
 * 05.04.26 Hiroyuki Nakamura
 */
//============================================================================================
#include "common.h"

#define __C_SCRCMD_C__	//このソースの中でだけ有効にしたもののために定義

#include <nitro/code16.h>
#include "system/pm_str.h"
#include "system\msgdata.h"			//MSGMAN_GetString
#include "system/brightness.h"		//ChangeBrightnessRequest
#include "system\wordset.h"			//WordSet_RegistPlayerName
#include "system/bmp_menu.h"
#include "system/bmp_list.h"
#include "system/get_text.h"
#include "system/window.h"
#include "system/fontproc.h"
#include "system/pms_data.h"
#include "system/wipe.h"
#include "system/snd_tool.h"
#include "system/pm_debug_wifi.h"

#include "fieldsys.h"
#include "fieldmap.h"
#include "fieldmap_work.h"
#include "fld_bmp.h"
#include "talk_msg.h"
#include "fieldobj.h"
#include "fld_bgm.h"
#include "map3d_object.h"
#include "field_subproc.h"
#include "field/field.h"
#include "field/poketch_data.h"
#include "field/eventflag.h"
#include "field/evwkdef.h"
#include "sysflag.h"
#include "syswork.h"
#include "vm.h"
#include "scrcmd.h"
#include "script.h"
#include "scr_tool.h"
#include "scrcmd_def.h"
#include "ev_win.h"
#include "ev_time.h"
#include "msgdata/msg.naix"			//NARC_msg_??_dat
#include "wifi_autoregist.h"
#include "application/wifi_p2pmatch.h"
#include "application/namein.h"
#include "poketool/pokeparty.h"
#include "battle/battle_common.h"	//↓インクルードに必要
#include "poketool/tr_tool.h"		//TT_TrainerMessageGet
#include "poketool/poke_tool.h"		//PokeParaWazaDelPos
#include "poketool/poke_memo.h"
#include "itemtool/myitem.h"		//MyItem_AddItem
#include "itemtool/item.h"			//ItemParamGet
#include "ev_mapchange.h"			//GMEVENT_Call_MapChange
#include "field_encount.h"			//DebugFieldEncount
#include "ev_poketch.h"
#include "comm_command_field.h"				//Union_ConnectIdSet
#include "comm_player.h"
#include "comm_union.h"				//Union_ConnectIdSet
#include "field/union_beacon_tool.h"		// UnionView_GetTrainerType
#include "comm_union_beacon.h"		// Union_BeaconChange
#include "comm_union_def.h"
#include "comm_command_safari.h"  //EventCmd_SafariTransData

#include "comm_regulation.h"
#include "comm_direct_counter.h"
#include "comm_field_state.h"
#include "communication/communication.h"
#include "communication/comm_def.h"
#include "communication/comm_state.h"
#include "report.h"
#include "ev_pokemon.h"				//EvPoke_Add
#include "situation_local.h"
#include "tel/pmtel_number.h"
#include "poketool/status_rcv.h"

#include "field_3d_anime_ev.h"

#include "savedata/custom_ball.h"
#include "savedata/system_data.h"
#include "savedata/dendou_data.h"
#include "savedata/savedata.h"
#include "savedata/phc_svdata.h"

#include "sodateya.h"

#include "gym.h"
#include "gym_init.h"
#include "eventdata.h"

#include "application/trainer_card.h"	//TR_CARD_DATA
#include "tr_card_setup.h"				//TRCSET_MakeTrainerInfo
#include "application/pokelist.h"
#include "application/btwr_app.h"
#include "savedata/zukanwork.h"
#include "savedata/imageclip_data.h"	//ImageClipSave
#include "include/application/imageClip/imc_sys.h"	//ImageClipProcData
#include "include/application/imageClip/imc_preview.h"	//ImageClipProcData
#include "include/poketool/monsno.h"
#include "savedata/coin.h"				//コインを扱う関数用
#include "application/cb_app.h"	///< custom ball
#include "include/system/pm_rtc.h"
#include "ookisa.h"						//大きさ比べ
#include "field/b_tower_fld.h"
#include "savedata/record.h"
#include "field/scr_btower.h"
#include "btl_searcher.h"
#include "field_cutin.h"
#include "scr_hideneff.h"
#include "player.h"
#include "demo\demo_dendou.h"
#include "scr_msg.h"
#include "wifi/dwc_rap.h"
#include "savedata/encount.h"
#include "move_pokemon.h"
#include "place_name.h"
#include "generate_zone.h"
#include "tv.h"
#include "field_trade_cmd.h"
#include "pc_recover_anm.h"
#include "elevator_anm.h"
#include "paso_anm.h"
#include "fld_cb.h"	///< custom ball
#include "..\application\p_status\ribbon.h"
#include "savedata/tv_work.h"
#include "tv_topic.h"		//テレビトピック生成用
#include "field/tvtopic_extern.h"
#include "field/msgboy.h"
#include "field/profileboy.h"
#include "poketool/poke_tool.h"
#include "battle/wazano_def.h"
#include "poketool/boxdata.h"
#include "scr_boxpwd.h"
#include "dendou_ball_anm.h"
#include "contest/contest.h"
#include "system/pmfprint.h"
#include "demo/syoujyou.h"
#include "weather_sys.h"
#include "system/pms_word.h"
#include "zonedata.h"
#include "fielddata/maptable/zone_id.h"
#include "system/msgdata_util.h"
#include "field_demo.h"
#include "fld_flg_init.h"
#include "application/guru2.h"
#include "../frontier/stage_def.h"
#include "../frontier/roulette_def.h"
#include "savedata/pgear_sv.h"
#include "application/pokegear.h"
#include "fld_pgear.h"
#include "tel/pmtel_datman.h"
#include "pair_poke.h"
#include "pair_poke_fld_move.h"
#include "field_picture.h"
#include "fielddata/script/saveflag.h"
#include "../fielddata/build_model/build_model_id.h"

#include "application/pokethlon_frame.h"
#include "demo/linear/linear_demo_call.h"
#include "demo/ship/ship_demo_call.h"
#include "demo/legend/legend_demo_call.h"

#include "system/pm_overlay.h"

#include "scr_pokethlon.h"
#include "scr_safari.h"
#include "safari/safari_sys.h"

#include "field_kairiki_eff.h"
#include "field_poketch.h"

#include "rock_result.h"
#include "head_result.h"

#include "fld_legend_demo.h"

#include "pokethlon_call.h"
#include "poke_select_call.h"
#include "fld_mushitori.h"
#include "scr_mushitori.h"

#include "savedata/pair_poke_data.h"	//for	PairPokeDataSave_SetForbidden
#include "savedata/gimmickwork.h"	//for	GIMMICKWORK
#include "field_gimmick_def.h"	//for	FLD_GIMMICK_GHOST_GYM

#include "poketch/numsel_sublcd.h"

#include "guinness_call.h"

#include "sheimi_form_rev.h"		//for SheimiFrmRev_CallEvt
#include "fld_trhouse.h"

#include "fld_sereby_eff.h"
#include "fld_arceus_eff.h"
#include "arceus_gmk_init.h"
#include "arceus_gmk.h"

#include "acce_game.h"

FS_EXTERN_OVERLAY(field_trade);
FS_EXTERN_OVERLAY(field_ookisa_kurabe);
FS_EXTERN_OVERLAY(field_mushitori);
FS_EXTERN_OVERLAY(field_kaseki);
FS_EXTERN_OVERLAY(field_point_win);
FS_EXTERN_OVERLAY(field_tr_house);
FS_EXTERN_OVERLAY(field_revenge);

//============================================================================================
//
//	extern宣言
//
//============================================================================================
#include "scr_group.h"		//EvCmdRandomGroup
#include "scr_kinomi.h"		//EvCmdSeed〜
#include "scr_shop.h"
#include "scr_name.h"
#include "scr_pokelot.h"
#include "scr_sound.h"
#include "scr_trainer.h"
#include "scr_postman.h"	//EvCmdMyP_steryPostMan
#include "scr_pokepark.h"	//EvCmdPokeParkControl他
#include "scr_coin.h"		//EvCmdCoin〜
#include "scr_gold.h"		//EvCmdGold〜
#include "scr_sodateya.h"	//EvCmdGetSodate〜
#include "scr_poke.h"
#include "scr_kaseki.h"
#include "scr_exchange.h"
#include "scr_sysflag.h"
#include "scr_item.h"
#include "scr_wazalist.h"
#include "scr_dprint.h"
#include "scr_factory.h"
#include "scr_stage.h"
#include "scr_castle.h"
#include "scr_roulette.h"
#include "scr_field.h"
#include "scr_field_sub.h"
#include "scr_wazaoshie.h"
#include "scr_wifilobby.h"	//EventCmd_WiFiLobby
#include "scr_deposit_win.h"


//============================================================================================
//
//	定義
//
//============================================================================================
typedef u16 (* pMultiFunc)();

//レジスタ比較の結果定義
enum {
    MINUS_RESULT = 0,	//比較結果がマイナス
    EQUAL_RESULT,		//比較結果がイコール
    PLUS_RESULT			//比較結果がプラス
};


//============================================================================================
//
//	プロトタイプ宣言
//
//============================================================================================
static BOOL EvCmdNop( VM_MACHINE * core );				//
static BOOL EvCmdDummy( VM_MACHINE * core );				//
static BOOL EvCmdEnd( VM_MACHINE * core );				//
static BOOL EvCmdTimeWait( VM_MACHINE * core );			//
static BOOL EvWaitTime(VM_MACHINE * core);
static BOOL EvCmdLoadRegValue( VM_MACHINE * core );
static BOOL EvCmdLoadRegWData( VM_MACHINE * core );
static BOOL EvCmdLoadRegAdrs( VM_MACHINE * core );
static BOOL EvCmdLoadAdrsValue( VM_MACHINE * core );
static BOOL EvCmdLoadAdrsReg( VM_MACHINE * core );
static BOOL EvCmdLoadRegReg( VM_MACHINE * core );
static BOOL EvCmdLoadAdrsAdrs( VM_MACHINE * core );
static BOOL EvCmdCmpMain( u16 r1, u16 r2 );
static BOOL EvCmdCmpRegReg( VM_MACHINE * core );			//
static BOOL EvCmdCmpRegValue( VM_MACHINE * core );		//
static BOOL EvCmdCmpRegAdrs( VM_MACHINE * core );
static BOOL EvCmdCmpAdrsReg( VM_MACHINE * core );
static BOOL EvCmdCmpAdrsValue(VM_MACHINE * core);
static BOOL EvCmdCmpAdrsAdrs(VM_MACHINE * core);
static BOOL EvCmdCmpWkValue( VM_MACHINE * core );			//
static BOOL EvCmdCmpWkWk( VM_MACHINE * core );			//
static BOOL EvCmdVMMachineAdd( VM_MACHINE * core );
static BOOL EvCmdChangeCommonScr( VM_MACHINE * core );
static BOOL EvChangeCommonScrWait(VM_MACHINE * core);
static BOOL EvCmdChangeLocalScr( VM_MACHINE * core );
static BOOL EvCmdGlobalJump( VM_MACHINE * core );			//
static FIELD_OBJ_PTR FieldObjPtrGetByObjId( FIELDSYS_WORK* fsys, int obj_id );
static BOOL EvCmdObjIDJump( VM_MACHINE * core );
static BOOL EvCmdBgIDJump( VM_MACHINE * core );
static BOOL EvCmdPlayerDirJump( VM_MACHINE * core );
static BOOL EvCmdGlobalCall( VM_MACHINE * core );			//
static BOOL EvCmdRet( VM_MACHINE * core );				//
static BOOL EvCmdIfJump( VM_MACHINE * core );				//
static BOOL EvCmdIfCall(VM_MACHINE * core);
static BOOL EvCmdFlagSet( VM_MACHINE * core );			//
static BOOL EvCmdFlagReset( VM_MACHINE * core );			//
static BOOL EvCmdFlagCheck( VM_MACHINE * core );			//
static BOOL EvCmdFlagCheckWk( VM_MACHINE * core );			//
static BOOL EvCmdFlagSetWk( VM_MACHINE * core );
static BOOL EvCmdFlagResetWk( VM_MACHINE * core );
static BOOL EvCmdTrainerFlagSet( VM_MACHINE * core );			//
static BOOL EvCmdTrainerFlagReset( VM_MACHINE * core );			//
static BOOL EvCmdTrainerFlagCheck( VM_MACHINE * core );			//
static BOOL EvCmdWkAdd( VM_MACHINE * core );				//
static BOOL EvCmdWkSub( VM_MACHINE * core );				//
static BOOL EvCmdLoadWkValue( VM_MACHINE * core );		//
static BOOL EvCmdLoadWkWk( VM_MACHINE * core );
static BOOL EvCmdLoadWkWkValue( VM_MACHINE * core );		//

static BOOL EvCmdTalkSioMsg( VM_MACHINE * core );
static BOOL EvCmdABKeyWait( VM_MACHINE * core );			//
static BOOL EvWaitABKey(VM_MACHINE * core);
static BOOL EvCmdLastKeyWait( VM_MACHINE * core );			//
static BOOL EvWaitLastKey(VM_MACHINE * core);
static BOOL EvCmdNextAnmLastKeyWait( VM_MACHINE * core );			//
static BOOL EvWaitNextAnmLastKey(VM_MACHINE * core);
static BOOL EvCmdTalkWinOpen( VM_MACHINE * core );			//
static BOOL EvCmdTalkWinClose( VM_MACHINE * core );		//
static BOOL EvCmdTalkWinCloseNoClear( VM_MACHINE * core );		//
static BOOL EvCmdBoardMake( VM_MACHINE * core );
static BOOL EvCmdInfoBoardMake( VM_MACHINE * core );
static BOOL EvCmdBoardReq( VM_MACHINE * core );
static BOOL EvCmdBoardWait( VM_MACHINE * core );
static BOOL BoardReqWait( VM_MACHINE * core );
static BOOL EvCmdBoardMsg( VM_MACHINE * core );
static BOOL BoardMsgWait( VM_MACHINE * core );
static BOOL EvCmdBoardEndWait( VM_MACHINE * core );
static BOOL BoardEndWait( VM_MACHINE * core );
static BOOL EvCmdMenuReq( VM_MACHINE * core );
static BOOL EvBgScrollWait( VM_MACHINE * core );
static BOOL EvCmdBgScroll( VM_MACHINE * core );
static BOOL EvCmdYesNoWin( VM_MACHINE * core );			//
static BOOL EvYesNoSelect(VM_MACHINE * core);
static BOOL EvCmdBmpMenuInit( VM_MACHINE * core );
static BOOL EvCmdBmpMenuInitEx( VM_MACHINE * core );
static BOOL EvCmdBmpMenuMakeList( VM_MACHINE * core );
static BOOL EvCmdBmpMenuMakeList16( VM_MACHINE * core );
static BOOL EvCmdBmpMenuStart( VM_MACHINE * core );
static BOOL EvSelWinWait(VM_MACHINE * core);
static BOOL EvCmdBmpListInit( VM_MACHINE * core );
static BOOL EvCmdBmpListInitEx( VM_MACHINE * core );
static BOOL EvCmdBmpListMakeList( VM_MACHINE * core );
static BOOL EvCmdBmpListStart( VM_MACHINE * core );
static BOOL EvCmdBmpListStartWidth( VM_MACHINE * core );
static BOOL EvCmdBmpListStartLpCp( VM_MACHINE * core );
static BOOL EvCmdBmpMenuHVStart( VM_MACHINE * core );
static BOOL EvCmdObjAnime( VM_MACHINE * core );			//
static BOOL EvCmdObjAnimeWait( VM_MACHINE * core );			//
static BOOL EvCmdObjPauseAll( VM_MACHINE * core );		//
static BOOL EvWaitPairObj( VM_MACHINE * core );
static BOOL EvCmdObjPauseClearAll( VM_MACHINE * core );	//
static BOOL EvCmdObjPause( VM_MACHINE * core );
static BOOL EvCmdObjPauseClear( VM_MACHINE * core );
static BOOL EvCmdObjAdd( VM_MACHINE * core );
static BOOL EvCmdObjDel( VM_MACHINE * core );
static BOOL EvCmdVanishDummyObjAdd( VM_MACHINE * core );
static BOOL EvCmdVanishDummyObjDel( VM_MACHINE * core );
static BOOL EvCmdVanishDummyObjAdd2( VM_MACHINE * core );
static BOOL EvCmdVanishDummyObjDel2( VM_MACHINE * core );
static BOOL EvCmdObjTurn( VM_MACHINE * core );			//
static BOOL EvCmdPlayerPosGet( VM_MACHINE * core );			//
static BOOL EvCmdObjPosGet( VM_MACHINE * core );			//
static BOOL EvCmdPlayerDirGet( VM_MACHINE * core );
static BOOL EvCmdPlayerPosOffsetSet( VM_MACHINE * core );
static BOOL EvCmdNotZoneDelSet( VM_MACHINE * core );
static BOOL EvCmdMoveCodeChange( VM_MACHINE * core );
static BOOL EvCmdMoveCodeGet( VM_MACHINE * core );
static BOOL EvCmdPairObjIdSet( VM_MACHINE * core );

static BOOL EvCmdUnknownFormGet(VM_MACHINE * core);
static BOOL EvCmdRevengeTrainerSearch(VM_MACHINE * core);
static BOOL EvCmdGetWeather( VM_MACHINE * core );
static BOOL EvCmdSetMapProc( VM_MACHINE * core );
static BOOL EvCmdWaitMapProcStart( VM_MACHINE * core );
static BOOL EvCmdFinishMapProc(VM_MACHINE * core);
static BOOL EvCmdWiFiAutoReg( VM_MACHINE * core );
static BOOL EvCmdWiFiP2PMatchEventCall( VM_MACHINE * core );
static BOOL EvCmdWiFiP2PMatchSetDel( VM_MACHINE * core );
static BOOL EvCmdCommGetCurrentID( VM_MACHINE * core );
static BOOL EvCmdPokeWindowPut( VM_MACHINE * core );
static void Scr_ZukanSeeSet( FIELDSYS_WORK* fsys, u16 monsno );
static BOOL EvCmdPokeWindowDel( VM_MACHINE * core );
static BOOL EvCmdBtlSearcherDirMvSet( VM_MACHINE * core );
static BOOL EvCmdProfileBoyEvent( VM_MACHINE * core );
static BOOL EvCmdImageClipSetProc( VM_MACHINE * core );
static BOOL EvCmdImageClipPreviewTvProc( VM_MACHINE * core );
static BOOL EvCmdImageClipTvSaveDataCheck( VM_MACHINE * core );
static BOOL EvCmdImageClipTvSaveTitle( VM_MACHINE * core );
static BOOL	EvCmdCustomBallEventCall( VM_MACHINE * core );
static BOOL EvCmdTMapBGSetProc( VM_MACHINE * core );
static BOOL EvCmdBTowerAppSetProc( VM_MACHINE * core );
static BOOL EvCmdBoxSetProc( VM_MACHINE * core );
static BOOL EvCmdOekakiBoardSetProc( VM_MACHINE * core );
static BOOL EvCmdCallTrCard( VM_MACHINE * core );
static BOOL EvCmdTradeListSetProc( VM_MACHINE * core );
static BOOL EvCmdRecordCornerSetProc( VM_MACHINE * core );
static BOOL EvCmdDendouSetProc( VM_MACHINE * core );
static BOOL EvCmdPcDendouSetProc( VM_MACHINE * core );
static BOOL EvCmdPcDendouDataCheck( VM_MACHINE * core );
static BOOL EvCmdWorldTradeSetProc( VM_MACHINE * core );
static BOOL EvCmdDPWInitProc( VM_MACHINE * core );
static BOOL EvCmdFirstPokeSelectProc( VM_MACHINE * core );
static BOOL EvCmdNameIn( VM_MACHINE * core );
static BOOL EvCmdNameInRival( VM_MACHINE * core );
static BOOL EvCmdNameInPoke( VM_MACHINE * core );
static BOOL EvCmdWipeFadeStart( VM_MACHINE * core );
static BOOL EvCmdWipeFadeCheck( VM_MACHINE * core );
static BOOL EvWaitWipeFadeCheck(VM_MACHINE * core);
static BOOL EvCmdMapChange( VM_MACHINE * core );
static BOOL EvCmdKabeNobori( VM_MACHINE * core );
static BOOL EvCmdNaminori( VM_MACHINE * core );
static BOOL EvCmdTakinobori( VM_MACHINE * core );
static BOOL EvCmdSorawotobu( VM_MACHINE * core );
static BOOL EvCmdHidenFlash(VM_MACHINE * core);
static BOOL EvCmdUzusio( VM_MACHINE * core );
static BOOL EvCmdCutIn( VM_MACHINE * core );
static BOOL EvWaitCutIn(VM_MACHINE * core);
static BOOL EvCmdBicycleCheck( VM_MACHINE * core );
static BOOL EvCmdBicycleReq( VM_MACHINE * core );
static BOOL EvCmdCyclingRoadSet( VM_MACHINE * core );
static BOOL EvCmdPlayerFormGet( VM_MACHINE * core );
static BOOL EvCmdPlayerReqBitOn( VM_MACHINE * core );
static BOOL EvCmdPlayerReqStart( VM_MACHINE * core );
static BOOL EvCmdFirstPokeNoGet(VM_MACHINE * core );
static BOOL EvCmdFirstPokeNoSet(VM_MACHINE * core );
static BOOL EvCmdGenerateInfoGet(VM_MACHINE * core );
static BOOL EvCmdTrainerMessageSet( VM_MACHINE * core );
static BOOL EvCmdConnectSelParentWin( VM_MACHINE * core );
static BOOL EvWaitConnectSelParentWin( VM_MACHINE * core );
static BOOL EvCmdConnectSelChildWin( VM_MACHINE * core );
static BOOL EvWaitConnectSelChildWin( VM_MACHINE * core );
static BOOL EvCmdConnectDebugParentWin( VM_MACHINE * core );
static BOOL EvCmdConnectDebugChildWin( VM_MACHINE * core );
static BOOL EvCmdDebugSioEncount( VM_MACHINE * core );
static BOOL EvCmdDebugSioContest( VM_MACHINE * core );
static BOOL EvCmdSpLocationSet( VM_MACHINE * core );
static BOOL EvCmdElevatorNowFloorGet( VM_MACHINE * core );
static BOOL EvCmdElevatorFloorWrite( VM_MACHINE * core );
static BOOL EvCmdGetJohtoZukanSeeNum( VM_MACHINE * core );
static BOOL EvCmdGetJohtoZukanGetNum( VM_MACHINE * core );
static BOOL EvCmdGetZenkokuZukanSeeNum( VM_MACHINE * core );
static BOOL EvCmdGetZenkokuZukanGetNum( VM_MACHINE * core );
static BOOL EvCmdChkZenkokuZukan( VM_MACHINE * core );
static BOOL EvCmdGetZukanHyoukaMsgID( VM_MACHINE * core );
static BOOL EvCmdWildBattleSet( VM_MACHINE * core );
static BOOL EvCmdSpWildBattleSet( VM_MACHINE * core );
static BOOL EvCmdEventGetWildBattleSet( VM_MACHINE * core );
static BOOL EvCmdFirstBattleSet( VM_MACHINE * core );
static BOOL EvCmdCaptureBattleSet( VM_MACHINE * core );
static BOOL EvCmdTSignSetProc( VM_MACHINE * core );
static BOOL EvCmdReportSaveCheck( VM_MACHINE * core );
static BOOL EvCmdReportSave( VM_MACHINE * core );
static BOOL EvCmdCommTimingSyncStart( VM_MACHINE * core );
static BOOL EvWaitCommIsTimingSync( VM_MACHINE * core );
static BOOL EvCmdCommTempDataReset( VM_MACHINE * core );
static BOOL EvCmdUnionParentCardTalkNo( VM_MACHINE * core );
static BOOL EvCmdUnionGetInfoTalkNo( VM_MACHINE * core );
static BOOL EvCmdUnionBeaconChange( VM_MACHINE * core );
static BOOL EvCmdUnionConnectTalkOk( VM_MACHINE * core );
static BOOL EvCmdUnionConnectTalkDenied( VM_MACHINE * core );
static BOOL EvCmdUnionTrainerNameRegist( VM_MACHINE * core );
static BOOL EvCmdUnionReturnSetUp( VM_MACHINE * core );
static BOOL EvCmdUnionConnectCutRestart( VM_MACHINE * core );
static BOOL EvWaitCommConnectCountZero(VM_MACHINE * core);
static BOOL EvCmdUnionGetTalkNumber( VM_MACHINE * core );
static BOOL EvCmdUnionIdSet( VM_MACHINE * core );
static BOOL EvCmdUnionConnectStart( VM_MACHINE * core );
static BOOL EvCmdUnionResultGet( VM_MACHINE * core );
static BOOL EvWaitUnionResultGet(VM_MACHINE * core);
static BOOL EvCmdUnionObjAllVanish( VM_MACHINE * core );
static BOOL EvCmdUnionScriptResultSet( VM_MACHINE * core );
static BOOL EvCmdUnionParentStartCommandSet( VM_MACHINE * core );
static BOOL EvWaitUnion_ParentStartCommandSet(VM_MACHINE * core);
static BOOL EvCmdUnionChildSelectCommandSet( VM_MACHINE * core );
static BOOL EvWaitUnion_ChildSelectCommandSet(VM_MACHINE * core);
static BOOL EvCmdUnionMapChange( VM_MACHINE * core );
static BOOL EvCmdUnionViewSetUpTrainerTypeSelect( VM_MACHINE * core );
static BOOL EvCmdUnionViewGetTrainerType( VM_MACHINE * core );
static BOOL EvCmdUnionViewGetTrainerTypeNo( VM_MACHINE * core );
static BOOL EvCmdUnionViewMyStatusSet( VM_MACHINE * core );
static BOOL EvCmdUnionBattleStartCheck( VM_MACHINE * core );
static BOOL EvCmdGameOverCall( VM_MACHINE * core );
static BOOL EvCmdSetWarpId( VM_MACHINE * core );
static BOOL EvCmdGetMySex( VM_MACHINE * core );
static BOOL EvCmdPcKaifuku( VM_MACHINE * core );
static BOOL EvCmdCommDirectEnd( VM_MACHINE * core );
static BOOL EvWaitCommDirectEnd(VM_MACHINE * core);
static BOOL EvCmdCommDirectEnterBtlRoom( VM_MACHINE * core );
static BOOL EvCmdCommPlayerSetDir( VM_MACHINE * core );
static BOOL EvCmdSxyPosChange( VM_MACHINE * core );
static BOOL EvCmdObjPosChange( VM_MACHINE * core );
static BOOL EvCmdSxyMoveCodeChange( VM_MACHINE * core );
static BOOL EvCmdSxyDirChange( VM_MACHINE * core );
static BOOL EvCmdSxyExitPosChange( VM_MACHINE * core );
static BOOL EvCmdSxyBgPosChange( VM_MACHINE * core );
static BOOL EvCmdObjDirChange( VM_MACHINE * core );
static BOOL EvCmdReturnScriptWkSet( VM_MACHINE * core );

static BOOL EvCmdSetUpDoorAnime( VM_MACHINE * core );
static BOOL EvCmdWait3DAnime( VM_MACHINE * core );
static BOOL EvCmdFree3DAnime( VM_MACHINE * core );
static BOOL EvCmdOpenDoor( VM_MACHINE * core );
static BOOL EvCmdCloseDoor( VM_MACHINE * core );
static BOOL EvCmdInitWaterGym( VM_MACHINE * core );
static BOOL EvCmdPushWaterGymButton( VM_MACHINE * core );
static BOOL EvCmdInitGhostGym( VM_MACHINE * core );
static BOOL EvCmdSetGhostGymLightTask( VM_MACHINE * core );
static BOOL EvCmdDelGhostGymLightTask( VM_MACHINE * core );
static BOOL EvCmdVanishGhostGymLight( VM_MACHINE * core );
static BOOL EvCmdInitCombatGym( VM_MACHINE * core );
static BOOL EvCmdInitElecGym( VM_MACHINE * core );
static BOOL EvCmdPushElecGymSwitch( VM_MACHINE * core );
static BOOL EvCmdCheckElecGymSwitch( VM_MACHINE * core );
static BOOL EvCmdEntryElecGymSwitch( VM_MACHINE * core );
static BOOL EvCmdPlayerPosAllGet( VM_MACHINE * core );
//金銀ジム
static BOOL EvCmdInitSkyGym( VM_MACHINE * core );
static BOOL EvCmdMoveSkyGymLift( VM_MACHINE * core );
static BOOL EvCmdInitInsectGym( VM_MACHINE * core );
static BOOL EvCmdMoveInsectGymLift( VM_MACHINE * core );
static BOOL EvCmdMoveInsectGymLever( VM_MACHINE * core );
static BOOL EvCmdInitDragonGym( VM_MACHINE * core );
static BOOL EvCmdInitPoisonGym( VM_MACHINE * core );
static BOOL EvCmdMoveCombatGymFall( VM_MACHINE * core );
static BOOL EvCmdInitAlmGym( VM_MACHINE * core );

static BOOL EvCmdBagSetProc( VM_MACHINE * core );
static BOOL EvCmdBagGetResult( VM_MACHINE * core);
static BOOL EvCmdShopSetProc( VM_MACHINE * core );
static BOOL EvCmdPocketCheck(VM_MACHINE * core);
static BOOL EvCmdTimeWaitIconAdd(VM_MACHINE * core);
static BOOL EvCmdTimeWaitIconDel(VM_MACHINE * core);

static BOOL EvCmdABKeyTimeWait( VM_MACHINE * core );
static BOOL EvWaitABKeyTime(VM_MACHINE * core);

static BOOL EvCmdPokeListSetProc(VM_MACHINE * core);
static BOOL EvCmdPokeListGetResult(VM_MACHINE * core);
static BOOL EvCmdBattleStagePokeListGetResult(VM_MACHINE * core);
static BOOL EvCmdBattleCastlePokeListGetResult(VM_MACHINE * core);
static BOOL EvCmdBattleRoulettePokeListGetResult(VM_MACHINE * core);
static BOOL EvCmdNpcTradePokeListSetProc(VM_MACHINE * core);

static BOOL EvCmdPokeStatusGetResult(VM_MACHINE * core);
static BOOL EvCmdPokeStatusSetProc(VM_MACHINE * core);

static BOOL EvCmdTamagoDemo( VM_MACHINE * core );

static BOOL EvCmdObjVisible( VM_MACHINE * core );
static BOOL EvCmdObjInvisible( VM_MACHINE * core );

///メールボックス用 by iwasawa
static BOOL EvCmdMailBox( VM_MACHINE * core );
static BOOL EvCmdGetMailBoxDataNum( VM_MACHINE * core );
///ギネスランキング
static BOOL EvCmdRankingView( VM_MACHINE * core );

static BOOL EvCmdGetTimeZone( VM_MACHINE * core );
static BOOL EvCmdGetRand( VM_MACHINE * core );
static BOOL EvCmdGetRandNext( VM_MACHINE * core );

static BOOL EvCmdImcAcceAddItem(VM_MACHINE * core);
static BOOL EvCmdImcAcceAddItemChk(VM_MACHINE * core);
static BOOL EvCmdImcAcceCheckItem(VM_MACHINE * core);
static BOOL EvCmdImcBgAddItem(VM_MACHINE * core);
static BOOL EvCmdImcBgCheckItem(VM_MACHINE * core);
static BOOL EvCmdUnionPokeListSetProc(VM_MACHINE * core);

static BOOL EvCmdZukanChkJohto(VM_MACHINE * core);
static BOOL EvCmdZukanChkNational(VM_MACHINE * core);
static BOOL EvCmdZukanRecongnize(VM_MACHINE * core);
static BOOL EvCmdPaperplaneSet(VM_MACHINE * core);

static BOOL EvCmdRecordInc(VM_MACHINE* core);
static BOOL EvCmdRecordGet(VM_MACHINE* core);
static BOOL EvCmdRecordSet(VM_MACHINE* core);
static BOOL EvCmdRecordAdd(VM_MACHINE* core);
static BOOL EvCmdRecordAddU32(VM_MACHINE* core);

static BOOL EvCmdDebugWatch(VM_MACHINE * core);

static BOOL EvCmdGetBeforeZoneID( VM_MACHINE * core);
static BOOL EvCmdGetNowZoneID( VM_MACHINE * core);
static BOOL EvCmdSafariControl( VM_MACHINE * core);

static BOOL EvCmdColosseumMapChangeIn( VM_MACHINE * core);
static BOOL EvCmdColosseumMapChangeOut( VM_MACHINE * core);

static BOOL EvCmdWifiEarthSetProc( VM_MACHINE * core );

static BOOL EvCmdToudaiRecoverDemoCall(VM_MACHINE *core);	//灯台回復デモ
static BOOL EvCmdPlayerHeightValid(VM_MACHINE * core);
static BOOL EvCmdStartGenerate(VM_MACHINE * core);
static BOOL EvCmdAddMovePoke(VM_MACHINE * core);
static BOOL EvCmdFldTradeAlloc(VM_MACHINE * core);
static BOOL EvCmdFldTradeMonsno(VM_MACHINE * core);
static BOOL EvCmdFldTradeChgMonsno(VM_MACHINE * core);
static BOOL EvCmdFldTradeChgMonsSex(VM_MACHINE * core);
static BOOL EvCmdFldTradeEvent(VM_MACHINE * core);
static BOOL EvCmdFldTradeDel(VM_MACHINE * core);
static BOOL EvCmdFldKeepPokeAdd(VM_MACHINE * core);
static BOOL EvCmdFldKeepPokeReturnCheck(VM_MACHINE * core);
static BOOL EvCmdZukanTextVerUp(VM_MACHINE * core);
static BOOL EvCmdZukanSexVerUp(VM_MACHINE * core);
static BOOL EvCmdZenkokuZukanFlag(VM_MACHINE * core);

static BOOL EvCmdChkPrmExp(VM_MACHINE * core);
static BOOL EvCmdChkWeek(VM_MACHINE * core);

static BOOL EvCmdRegulationListCall(VM_MACHINE * core);
static BOOL EvCmdPcRecoverAnm(VM_MACHINE * core);
static BOOL EvCmdElevatorAnm(VM_MACHINE * core);
static BOOL EvCmdPMSInputProc(VM_MACHINE * core);
static BOOL EvCmdPMSInputDoubleProc(VM_MACHINE * core);
static BOOL EvCmdPMSBuf(VM_MACHINE * core);

static BOOL EvCmdPMVersionGet(VM_MACHINE * core);

static BOOL EvCmdAikotobaKabegamiSet(VM_MACHINE * core);
static BOOL EvCmdGetAikotobaEgg(VM_MACHINE * core);

static BOOL EvCmdSetUpPasoAnime( VM_MACHINE * core );
static BOOL EvCmdStartPasoOnAnime(VM_MACHINE * core);
static BOOL EvCmdStartPasoOffAnime(VM_MACHINE * core);

static BOOL EvCmdPokeBoxCountEmptySpace(VM_MACHINE * core);

static BOOL EvCmdReportDrawProcSet( VM_MACHINE * core );
static BOOL EvCmdReportDrawProcDel( VM_MACHINE * core );

static BOOL EvCmdDendouBallAnm(VM_MACHINE * core);
static BOOL EvCmdAddScore(VM_MACHINE * core);

static BOOL EvCmdPartyMonsNoCheck(VM_MACHINE * core);
static BOOL EvCmdPartyDeokisisuFormChange(VM_MACHINE * core);
static BOOL EvCmdCheckMinomuchiComp( VM_MACHINE * core );
static BOOL EvCmdPoketchHookSet( VM_MACHINE * core );
static BOOL EvCmdPoketchHookReset( VM_MACHINE * core );

static BOOL EvCmdGetNowHour( VM_MACHINE * core );

static BOOL EvCmdObjShakeAnm( VM_MACHINE * core );
static BOOL EvCmdObjBlinkAnm( VM_MACHINE * core );
static BOOL EvCmd_D20R0106Legend_IsUnseal( VM_MACHINE * core );

static BOOL EvCmdDressingImcAcceCheck(VM_MACHINE * core);
static BOOL EvCmdAgbCartridgeVerGet( VM_MACHINE * core );
static BOOL EvCmdHideMapStateChange( VM_MACHINE * core );

static BOOL EvCmdImcBgNameSet( VM_MACHINE * core );
static BOOL EvCmdLevelJijiiNo(VM_MACHINE * core);
static BOOL EvCmdImcAcceSubItem(VM_MACHINE * core);
static BOOL EvCmdLevelJijiiInit(VM_MACHINE * core);
static BOOL EvCmdNewNankaiWordSet(VM_MACHINE * core);
static BOOL EvCmdRegularCheck( VM_MACHINE * core );
static BOOL EvCmdNankaiWordCompleteCheck(VM_MACHINE * core);
static BOOL EvCmdBirthDayCheck(VM_MACHINE * core);
static BOOL EvCmdAnoonGetNum( VM_MACHINE * core );
static BOOL EvCmdIsHaihuEventEnable(VM_MACHINE *core);
static BOOL EvCmdPokeWindowPutPP( VM_MACHINE * core );
static BOOL EvCmdPokeWindowAnm( VM_MACHINE * core );
static BOOL EvCmdPokeWindowAnmWait( VM_MACHINE * core );
static BOOL EvWaitPokeWindowAnmWait(VM_MACHINE * core);
static BOOL EvCmdDendouNumGet( VM_MACHINE * core );
static BOOL EvCmdGetRandomHit( VM_MACHINE * core );

static BOOL EvCmdSodateyaPokeListSetProc(VM_MACHINE * core);
static BOOL EvCmdSodateyaPokeListGetResult(VM_MACHINE * core);

static BOOL EvCmdHidenEffStart(VM_MACHINE * core);
static BOOL EvCmdObjAnimePos(VM_MACHINE * core);
static BOOL EvCmdCheckMyGSID(VM_MACHINE * core);
static BOOL EvCmdGetFriendDataNum(VM_MACHINE * core);
static BOOL EvCmdAusuItemCheck(VM_MACHINE * core);
static BOOL EvCmdAikotobaOkurimonoChk(VM_MACHINE * core);
static BOOL EvCmdWifiHusiginaokurimonoOpenFlagSet(VM_MACHINE * core);
static BOOL EvCmdUnionGetCardTalkNo( VM_MACHINE * core );
static BOOL EvCmdWirelessIconEasy( VM_MACHINE * core );
static BOOL EvCmdWirelessIconEasyEnd( VM_MACHINE * core );
static BOOL EvCmdSaveFieldObj( VM_MACHINE * core );
static BOOL EvCmdTalkObjPauseAll( VM_MACHINE * core );
static BOOL EvCmdSetEscapeLocation(VM_MACHINE* core);
static BOOL EvCmdFieldObjBitSetFellowHit( VM_MACHINE * core );
static BOOL EvSelUnionWinWait(VM_MACHINE * core);
static BOOL EvCmdUnionBmpMenuStart( VM_MACHINE * core );
static BOOL EvCmdCommDirectEndTiming( VM_MACHINE * core );
static BOOL EvCmdGetCardRank( VM_MACHINE * core );
static BOOL EvCmdBicycleReqNonBgm( VM_MACHINE * core );

static BOOL EvCmdReportInfoWinOpen( VM_MACHINE * core );
static BOOL EvCmdReportInfoWinClose( VM_MACHINE * core );

static BOOL EvCmdFieldScopeModeSet( VM_MACHINE * core );
static BOOL EvCmdFrontierSystemCall( VM_MACHINE * core );

static BOOL EvCmdGuru2SetProc( VM_MACHINE * core );
static BOOL EvCmdUnionGetRomCode( VM_MACHINE * core );
static BOOL EvCmdExtraSaveInit( VM_MACHINE * core );
static BOOL EvCmdExtraSaveInitCheck( VM_MACHINE * core );

BOOL EvCmdFrontierMonitor( VM_MACHINE * core );
BOOL EvCmdScratch( VM_MACHINE * core );
BOOL EvCmdScratchFree(VM_MACHINE * core);
BOOL EvCmdScratchItemGet(VM_MACHINE * core);

static BOOL EvCmdGdsSetProc( VM_MACHINE * core );

static BOOL EvCmdWiFiLobbySetProc( VM_MACHINE * core );
static BOOL EvCmdContABKey( VM_MACHINE * core );

static BOOL EvCmdRotomuFormCheck( VM_MACHINE * core );
static BOOL EvCmdScoreAdd( VM_MACHINE * core );

static BOOL EvCmdHeapCheck( VM_MACHINE * core );
static BOOL EvCmdZukanSeeSet( VM_MACHINE * core );
static BOOL EvCmdWflbyCounterTime( VM_MACHINE * core );
static BOOL EvCmdGirathinaFormUpdate( VM_MACHINE * core );
static BOOL EvCmdHaihuPokeCheck( VM_MACHINE * core );

static BOOL EvCmdPairPoke_CheckBig( VM_MACHINE * core );

static BOOL EvCmdPairPoke_TestBallon( VM_MACHINE * core );
static BOOL EvCmdPairPoke_ChangePosition( VM_MACHINE * core );
static BOOL EvCmdPairPoke_PCCounterJumpAnm( VM_MACHINE * core );
static BOOL EvCmdPairPoke_BallIn( VM_MACHINE * core );
static BOOL EvCmdPairPoke_TalkStart( VM_MACHINE * core );
static BOOL EvCmdPairPoke_PauseCnt( VM_MACHINE * core );
static BOOL EvCmdPairPoke_WaitAnime( VM_MACHINE * core );
static BOOL EvCmdPairPoke_ChangeMoveCode( VM_MACHINE * core );
static BOOL EvCmdMoveSeamlessCamera(VM_MACHINE * core);
static BOOL EvWaitPairPokeAnm(VM_MACHINE * core);
static BOOL EvCmdPairPoke_SetPlayerSidePos( VM_MACHINE * core );
static BOOL EvCmdPairPoke_SetPlayerPos( VM_MACHINE * core );
static BOOL EvCmdPairPoke_SetPlayerPosNoSt( VM_MACHINE * core );
static BOOL EvCmdPairPoke_Appear( VM_MACHINE * core );
static BOOL EvCmdPairPoke_SetGridCenter( VM_MACHINE * core );

static BOOL EvCmdCallPokethlonProc(VM_MACHINE * core);
static BOOL EvCmdGetSupportObjCharCode(VM_MACHINE* core);
static BOOL EvCmdSetPGearAppOpenFlag(VM_MACHINE* core);
static BOOL EvCmdSetPGearMapOpenLevel(VM_MACHINE* core);
static BOOL EvCmdAddTelNumber(VM_MACHINE* core);
static BOOL EvCmdIsTelNumberEntry(VM_MACHINE* core);
static BOOL EvCmdCallPGearTelParamSet(VM_MACHINE* core);
static BOOL EvCmdCallPGear(VM_MACHINE* core);
static BOOL EvCmdGetTelBookFromTrID(VM_MACHINE* core);
static BOOL EvCmdGetTelNumberEntryMsg(VM_MACHINE* core);
static BOOL EvCmdResetRevengeFlag(VM_MACHINE* core);
static BOOL EvCmdGetRevengeItem(VM_MACHINE* core);
static BOOL EvCmdGetTelItemEvData(VM_MACHINE* core);
static BOOL EvCmdTelIncomingReservation(VM_MACHINE* core);
static BOOL EvCmdTelResetReserve(VM_MACHINE* core);

static BOOL EvCmdTakePicture(VM_MACHINE* core);
static BOOL EvCmdGetPictureDataNum(VM_MACHINE* core);
static BOOL EvCmdPhotoAlbumCall(VM_MACHINE* core);

static BOOL EvCmdSetupLaboMOnsBall(VM_MACHINE* core);
static BOOL EvCmdObjDirGet( VM_MACHINE * core );
static BOOL EvCmdPairPoke_SetReaction( VM_MACHINE * core );
static BOOL EvCmdCallPkthRecord(VM_MACHINE* core);
static BOOL EvCmdCallAnPuzzle(VM_MACHINE* core);
static BOOL EvCmdCallLinearDemo(VM_MACHINE * core);
static BOOL EvCmdCallShipDemo(VM_MACHINE * core);
static BOOL EvCmdCallLegendDemo(VM_MACHINE * core);

static BOOL EvCmdCallGetLivingPokeIdxTop( VM_MACHINE * core );
static BOOL EvCmdPairPoke_WhiteFlash( VM_MACHINE * core );
static BOOL EvCmdIsPairPoke( VM_MACHINE * core );
static BOOL EvCmdPairPoke_IsVanish( VM_MACHINE * core );
static BOOL EvCmdPairPoke_SetKairikiEff( VM_MACHINE * core );
static BOOL EvCmdPairPoke_AddHumorVal( VM_MACHINE * core );
static BOOL EvCmdPairPoke_CheckType( VM_MACHINE * core );
static BOOL EvCmdPairPoke_JumpAct( VM_MACHINE * core );

static BOOL EvCmdCall_SubLcdSelectStart( VM_MACHINE * core );
static BOOL EvCmdCall_SubLcdSelectEnd( VM_MACHINE * core );
static BOOL EvSubLcdSelectSystem(VM_MACHINE * core);
static BOOL EvReturnSubLcdSelectSystem(VM_MACHINE * core);

static BOOL EvCmdTouchYesNoWin( VM_MACHINE * core );
static BOOL EvTouchYesNoSelect(VM_MACHINE * core);
static BOOL EvCmdTouchBmpListInit( VM_MACHINE * core );
static BOOL EvCmdTouchBmpListInitEx( VM_MACHINE * core );
static BOOL EvCmdTouchBmpListMakeList( VM_MACHINE * core );
static BOOL EvCmdTouchBmpListStart( VM_MACHINE * core );
static BOOL EvSelTouchWinWait(VM_MACHINE * core);
static BOOL EvCmdCall_SubLcdSelectReserve( VM_MACHINE *core );


static BOOL EvCmdRockRslt( VM_MACHINE * core );
static BOOL EvCmdHeadRslt( VM_MACHINE * core );

static BOOL EvCmdAllocLegFldDemoWork( VM_MACHINE * core );
static BOOL EvCmdFreeLegFldDemoWork( VM_MACHINE * core );
static BOOL EvCmdAppLegBell( VM_MACHINE * core );
static BOOL EvCmdAppLegReso( VM_MACHINE * core );
static BOOL EvCmdAppLegEyes( VM_MACHINE * core );
static BOOL EvCmdStartLegMapBellAnm( VM_MACHINE * core );
static BOOL EvCmdSetLegCam( VM_MACHINE * core );
static BOOL EvCmdMoveLegCam( VM_MACHINE * core );
static BOOL EvCmdMoveLegCamWait( VM_MACHINE * core );
static BOOL EvCmdDescendLegPoke( VM_MACHINE * core );
static BOOL EvCmdStartLegWeather( VM_MACHINE * core );
static BOOL EvCmdEndLegWeather( VM_MACHINE * core );
static BOOL EvCmdInitLegAfApp( VM_MACHINE * core );
static BOOL EvCmdEndLegAfApp( VM_MACHINE * core );
static BOOL EvCmdReturnLegCamera( VM_MACHINE * core );

static BOOL EvCmdPairPoke_AppForbdn( VM_MACHINE * core );
static BOOL EvCmdOverlaySet( VM_MACHINE * core );

static BOOL EvCmdNumSelSubLCDCall( VM_MACHINE * core );
static BOOL EvNumSelWait(VM_MACHINE * core);

static BOOL EvCmdCompDeposit( VM_MACHINE * core );

static BOOL EvCmdGetRegulationCupName( VM_MACHINE * core );
static BOOL EvCmdGetRegulationCupNameWork( VM_MACHINE * core );
static BOOL EvCmdRegulationSet( VM_MACHINE * core );
static BOOL EvCmdRegulationWinPut( VM_MACHINE * core );
static BOOL EvCmdRegulationWinDel( VM_MACHINE * core );
static BOOL EvCmdRegulationPokeCheck( VM_MACHINE * core );
static BOOL EvCmdLoadSeSceneData( VM_MACHINE * core );
static BOOL	EvCmdSheimiFormRev( VM_MACHINE * core );
static BOOL EvCmdTimeLeapEff( VM_MACHINE * core );

static BOOL EvCmdNamiBGMForbdn( VM_MACHINE * core );

static BOOL EvCmdAnnoeneEff( VM_MACHINE * core );
static BOOL EvCmdFlashBallEff( VM_MACHINE * core );

static BOOL EvCmdInitArceusGmk( VM_MACHINE * core );
static BOOL EvCmdVanishArceusGmk( VM_MACHINE * core );
static BOOL EvCmdChgArceusGmkAnm( VM_MACHINE * core );

static BOOL EvCmdSafari_DataTrans( VM_MACHINE * core );
static BOOL EvCmdGetSafariNameWork( VM_MACHINE * core );
static BOOL EvCmdIsSafariDataAndDelete( VM_MACHINE * core );

static BOOL EvCmdPairPoke_IsNeghbor( VM_MACHINE * core );


static BOOL EvCmdAcceGameChkComp( VM_MACHINE * core );
static BOOL EvCmdAcceGameGetAcceNo( VM_MACHINE * core );
static BOOL EvCmdAcceGameChkImcBgComp( VM_MACHINE * core );
static BOOL EvCmdAcceGameGetImcBgNoRnd( VM_MACHINE * core );
static BOOL EvCmdMysteryRegulationCheck( VM_MACHINE * core );

static BOOL EvDepositCheck( VM_MACHINE * core );

static BOOL EvCmdCheckPokecenZoneID( VM_MACHINE * core );

//============================================================================================
//
//	グローバル変数
//
//============================================================================================
//条件分岐用テーブル
static const u8 ConditionTable[6][3] =
{
    //	  MINUS  EQUAL  PLUS
    { TRUE,	 FALSE, FALSE },	// LT
    { FALSE, TRUE,  FALSE },	// EQ
    { FALSE, FALSE, TRUE  },	// GT
    { TRUE,  TRUE,  FALSE },	// LE
    { FALSE, TRUE,  TRUE  },	// GE
    { TRUE,  FALSE, TRUE  }		// NE
};

static const BMPWIN_DAT YesNoBmpDat = {
    FLD_MBGFRM_FONT, FLD_YESNO_WIN_PX, FLD_YESNO_WIN_PY,
    FLD_YESNO_WIN_SX, FLD_YESNO_WIN_SY, FLD_YESNO_WIN_PAL, FLD_YESNO_WIN_CGX
};

const VM_CMD ScriptCmdTbl[] = {
    EvCmdNop,
    EvCmdDummy,				//※使用していませんが消さないでください。
    EvCmdEnd,
    EvCmdTimeWait,			//

    EvCmdLoadRegValue,
    EvCmdLoadRegWData,
    EvCmdLoadRegAdrs,
    EvCmdLoadAdrsValue,
    EvCmdLoadAdrsReg,
    EvCmdLoadRegReg,
    EvCmdLoadAdrsAdrs,		//10

    EvCmdCmpRegReg,
    EvCmdCmpRegValue,
    EvCmdCmpRegAdrs,
    EvCmdCmpAdrsReg,
    EvCmdCmpAdrsValue,
    EvCmdCmpAdrsAdrs,
    EvCmdCmpWkValue,
    EvCmdCmpWkWk,

    EvCmdVMMachineAdd,		//
    EvCmdChangeCommonScr,	//20
    EvCmdChangeLocalScr,	//

    EvCmdGlobalJump,		//
    EvCmdObjIDJump,
    EvCmdBgIDJump,
    EvCmdPlayerDirJump,
    EvCmdGlobalCall,		//
    EvCmdRet,				//
    EvCmdIfJump,			//
    EvCmdIfCall,

    EvCmdFlagSet,			//30
    EvCmdFlagReset,
    EvCmdFlagCheck,
    EvCmdFlagSetWk,
	EvCmdFlagResetWk,			///<フラグリセッワークバージョン
    EvCmdFlagCheckWk,

    EvCmdTrainerFlagSet,
    EvCmdTrainerFlagReset,
    EvCmdTrainerFlagCheck,

    EvCmdWkAdd,
    EvCmdWkSub,

    EvCmdLoadWkValue,		//40
    EvCmdLoadWkWk,
    EvCmdLoadWkWkValue,

    EvCmdTalkMsgAllPut,		//
    EvCmdTalkMsg,			//
    EvCmdTalkMsgSp,			//
    EvCmdTalkMsgNoSkip,		//
	EvCmdTalkSioMsg,		//
	EvCmdABKeyWait,			//
    EvCmdLastKeyWait,		//
    EvCmdNextAnmLastKeyWait,//50
    EvCmdTalkWinOpen,		//
    EvCmdTalkWinClose,		//
    EvCmdTalkWinCloseNoClear,//

    EvCmdBoardMake,			//看板作成（タウンマップ、標識、表札）
    EvCmdInfoBoardMake,		//看板作成（掲示板）
    EvCmdBoardReq,			//看板制御リクエスト
    EvCmdBoardWait,
    EvCmdBoardMsg,			//看板メッセージ表示
    EvCmdBoardEndWait,

    EvCmdMenuReq,			//メニューリクエスト
    EvCmdBgScroll,			//60

    EvCmdYesNoWin,			//

	EvCmdBmpMenuInit,
    EvCmdBmpMenuInitEx,
    EvCmdBmpMenuMakeList,
    EvCmdBmpMenuStart,

	EvCmdBmpListInit,
    EvCmdBmpListInitEx,
    EvCmdBmpListMakeList,	//70
    EvCmdBmpListStart,		//

	EvCmdBmpMenuHVStart,

	EvCmdSePlay,			//
    EvCmdSeStop,			//
    EvCmdSeWait,
    EvCmdVoicePlay,			//
    EvCmdVoicePlayWait,		//
    EvCmdMePlay,
    EvCmdMeWait,
    EvCmdBgmPlay,			//80
    EvCmdBgmStop,			//
    EvCmdBgmNowMapPlay,
    EvCmdBgmSpecialSet,		//
    EvCmdBgmFadeOut,
    EvCmdBgmFadeIn,
    EvCmdBgmPlayerPause,
    EvCmdPlayerFieldDemoBgmPlay,
    EvCmdCtrlBgmFlagSet,

    EvCmdPerapDataCheck,
    EvCmdPerapRecStart,
    EvCmdPerapRecStop,		//
    EvCmdPerapSave,

    EvCmdSndClimaxDataLoad,

    EvCmdObjAnime,			//
    EvCmdObjAnimeWait,		//
    EvCmdObjPauseAll,		//
    EvCmdObjPauseClearAll,	//
    EvCmdObjPause,			//
    EvCmdObjPauseClear,		//
    EvCmdObjAdd,			//
    EvCmdObjDel,			//

	EvCmdVanishDummyObjAdd,	//100
    EvCmdVanishDummyObjDel,	//

	EvCmdObjTurn,			//102
    EvCmdPlayerPosGet,		//
    EvCmdObjPosGet,			//
    EvCmdPlayerPosOffsetSet,

    EvCmdNotZoneDelSet,		//
    EvCmdMoveCodeChange,	//

    EvCmdAddGold,			//お金関連すべて
    EvCmdSubGold,
    EvCmdCompGold,
    EvCmdGoldWinWrite,
    EvCmdGoldWinDel,
    EvCmdGoldWrite,			//お金関連ここまで

    EvCmdExPointWinWrite,		//コイン関連すべて
    EvCmdExPointWinDel,
    EvCmdExPointWrite,
    EvCmdCheckCoin,
    EvCmdAddCoin,
    EvCmdSubCoin,			//コイン関連ここまで
	EvCmdAddWkThlnPoint,
	EvCmdSubWkThlnPoint,
	EvCmdCompWkThlnPoint,

	EvCmdAddItem,
    EvCmdSubItem,
    EvCmdAddItemChk,
    EvCmdCheckItem,
    EvCmdWazaMachineItemNoCheck,

	EvCmdGetPocketNo,
    EvCmdFirstPokeNoSet,
	EvCmdTalkMsgSexDistinction,	//性別メッセージ表示

	EvCmdCBItemNumGet,
    EvCmdCBItemNumAdd,
	EvCmdCBItemRandomGet,
    EvCmdUnknownFormGet,

    EvCmdAddPokemon,		//ポケモン関連すべて
    EvCmdAddTamago,
    EvCmdChgPokeWaza,
    EvCmdChkPokeWaza,
    EvCmdChkPokeWazaGroup,		//ポケモン関連ここまで

    EvCmdRevengeTrainerSearch,
	EvCmdNameInRival,

    EvCmdGetSupportObjCharCode,
	EvCmdSetPGearAppOpenFlag,

    EvCmdAddTelNumber,
    EvCmdIsTelNumberEntry,
	EvCmdTelIncomingReservation,
	EvCmdTelResetReserve,

    EvCmdSetMapProc,

	EvCmdWiFiAutoReg,
    EvCmdWiFiP2PMatchEventCall,
    EvCmdWiFiP2PMatchSetDel,
    EvCmdImageClipSetProc,
    EvCmdImageClipPreviewTvProc,
    EvCmdCustomBallEventCall,

    EvCmdTMapBGSetProc,
    EvCmdBoxSetProc,
    EvCmdOekakiBoardSetProc,
    EvCmdCallTrCard,
    EvCmdTradeListSetProc,
    EvCmdRecordCornerSetProc,
    EvCmdDendouSetProc,
    EvCmdPcDendouSetProc,
    EvCmdWorldTradeSetProc,
    EvCmdDPWInitProc,

    EvCmdFirstPokeSelectProc,

    EvCmdEyeTrainerMoveSet,
    EvCmdEyeTrainerMoveCheck,
    EvCmdEyeTrainerTypeGet,
    EvCmdEyeTrainerIdGet,

    EvCmdNameIn,
    EvCmdNameInPoke,

    EvCmdWipeFadeStart,
    EvCmdWipeFadeCheck,

    EvCmdMapChange,
    EvCmdKabeNobori,
    EvCmdNaminori,
    EvCmdTakinobori,
    EvCmdSorawotobu,
    EvCmdHidenFlash,
	EvCmdUzusio,
    EvCmdCutIn,

    EvCmdBicycleCheck,
    EvCmdBicycleReq,
    EvCmdCyclingRoadSet,

    EvCmdPlayerFormGet,
    EvCmdPlayerReqBitOn,
    EvCmdPlayerReqStart,

    EvCmdPlayerName,
    EvCmdRivalName,
    EvCmdSupportName,
    EvCmdPokemonName,
    EvCmdItemName,

    EvCmdPocketName,
    EvCmdItemWazaName,
    EvCmdWazaName,
    EvCmdNumberName,
    EvCmdNickName,

    EvCmdTrTypeName,
    EvCmdMyTrTypeName,
    EvCmdPokemonNameExtra,
    EvCmdFirstPokemonName,

    EvCmdRivalPokemonName,
    EvCmdSupportPokemonName,
    EvCmdFirstPokeNoGet,
    EvCmdGoodsName,
    EvCmdTrapName,
    EvCmdTamaName,
    EvCmdZoneName,
    EvCmdGenerateInfoGet,

    EvCmdTrainerIdGet,
    EvCmdTrainerBattleSet,
    EvCmdTrainerMessageSet,
    EvCmdTrainerTalkTypeGet,
    EvCmdRevengeTrainerTalkTypeGet,
    EvCmdTrainerTypeGet,
    EvCmdTrainerBgmSet,
    EvCmdTrainerLose,
    EvCmdTrainerLoseCheck,
    EvCmdSeacretPokeRetryCheck,
    EvCmd2vs2BattleCheck,

    EvCmdDebugBattleSet,
    EvCmdDebugTrainerFlagSet,
    EvCmdDebugTrainerFlagOnJump,

    EvCmdConnectSelParentWin,
    EvCmdConnectSelChildWin,
    EvCmdConnectDebugParentWin,
    EvCmdConnectDebugChildWin,

    EvCmdDebugSioEncount,
    EvCmdDebugSioContest,

	EvCmdPkthSioTimingSend,
	EvCmdPkthSioTimingCheck,
	EvCmdPkthSystemCreate,
	EvCmdPkthSystemExit,

	EvCmdPkthMyEntryNoGet,

	EvCmdPkthMsgPrintFlagSet,

    EvCmdChkTemotiPokerus,
    EvCmdTemotiPokeSexGet,

    EvCmdSpLocationSet,

	EvCmdElevatorNowFloorGet,
    EvCmdElevatorFloorWrite,

    EvCmdGetJohtoZukanSeeNum,
    EvCmdGetJohtoZukanGetNum,
    EvCmdGetZenkokuZukanSeeNum,
    EvCmdGetZenkokuZukanGetNum,
    EvCmdChkZenkokuZukan,
    EvCmdGetZukanHyoukaMsgID,

    EvCmdWildBattleSet,
    EvCmdFirstBattleSet,
    EvCmdCaptureBattleSet,

    EvCmdTSignSetProc,

	EvCmdReportSaveCheck,
    EvCmdReportSave,

    EvCmdImageClipTvSaveDataCheck,
    EvCmdImageClipTvSaveTitle,
    EvCmdCommTimingSyncStart,
    EvCmdCommTempDataReset,

    EvCmdUnionParentCardTalkNo,
    EvCmdUnionGetInfoTalkNo,
    EvCmdUnionBeaconChange,

	EvCmdUnionConnectTalkDenied,
    EvCmdUnionConnectTalkOk,

    EvCmdUnionTrainerNameRegist,
    EvCmdUnionReturnSetUp,
    EvCmdUnionConnectCutRestart,
    EvCmdUnionGetTalkNumber,
    EvCmdUnionIdSet,
    EvCmdUnionResultGet,
    EvCmdUnionObjAllVanish,
    EvCmdUnionScriptResultSet,
    EvCmdUnionParentStartCommandSet,
    EvCmdUnionChildSelectCommandSet,
    EvCmdUnionConnectStart,

    EvCmdShopCall,
    EvCmdFixShopCall,
    EvCmdFixGoodsCall,
    EvCmdFixSealCall,

    EvCmdGameOverCall,

	EvCmdSetWarpId,
    EvCmdGetMySex,
    EvCmdPcKaifuku,

	EvCmdCommDirectEnd,
    EvCmdCommDirectEnterBtlRoom,
    EvCmdCommPlayerSetDir,

    EvCmdUnionMapChange,
    EvCmdUnionViewSetUpTrainerTypeSelect,
    EvCmdUnionViewGetTrainerType,
    EvCmdUnionViewMyStatusSet,

    EvCmdSysFlagZukanGet,
    EvCmdSysFlagZukanSet,
    EvCmdSysFlagShoesGet,
    EvCmdSysFlagShoesSet,
    EvCmdSysFlagBadgeGet,
    EvCmdSysFlagBadgeSet,
    EvCmdSysFlagBadgeCount,
    EvCmdSysFlagBagGet,
    EvCmdSysFlagBagSet,
    EvCmdSysFlagPairGet,
    EvCmdSysFlagPairSet,
    EvCmdSysFlagPairReset,
    EvCmdSysFlagOneStepGet,
    EvCmdSysFlagOneStepSet,
    EvCmdSysFlagOneStepReset,
    EvCmdSysFlagGameClearGet,
    EvCmdSysFlagGameClearSet,

    EvCmdSetUpDoorAnime,
    EvCmdWait3DAnime,
    EvCmdFree3DAnime,
    EvCmdOpenDoor,
    EvCmdCloseDoor,

    EvCmdGetSodateyaName,
    EvCmdGetSodateyaZiisan,

	EvCmdInitGhostGym,			//ゴーストジム初期化
	EvCmdSetGhostGymLightTask,	//ゴーストジムスポットライトタスクセット
	EvCmdDelGhostGymLightTask,	//ゴーストジムスポットライトタスク削除
	EvCmdVanishGhostGymLight,	//ゴーストジムスポットライト消すイベントセット
    EvCmdInitCombatGym,			//格闘ジム初期化
	EvCmdMoveCombatGymFall,		//格闘ジムギミック発動
    EvCmdInitElecGym,			//電気ジム
    EvCmdPushElecGymSwitch,		//電気ジムギミックゴミ箱スイッチ
	EvCmdCheckElecGymSwitch,	//電気ジムギミックゴミ箱スイッチチェック
	EvCmdEntryElecGymSwitch,	//電気ジムギミックゴミ箱スイッチ抽選

	EvCmdInitSkyGym,			//飛行ジム初期化
    EvCmdMoveSkyGymLift,		//飛行ジムリフトムーブ
	EvCmdInitInsectGym,			//虫ジム初期化
    EvCmdMoveInsectGymLift,		//虫ジムリフトムーブ
	EvCmdMoveInsectGymLever,	//虫ジムレーバー
	EvCmdInitDragonGym,			//ドラゴンジム初期化
	EvCmdInitPoisonGym,			//毒ジム初期化
	EvCmdInitAlmGym,			//万能ジム初期化

	EvCmdGetPokeCount,			//手持ちポケモン数取得

    EvCmdBagSetProc,			//バッグ画面呼び出し
    EvCmdBagGetResult,			//バッグ画面結果取り出し

    EvCmdPocketCheck,			//ポケットの中にどうぐがあるかチェック
    EvCmdNutsName,				//きのみタグの名前
    EvCmdSeikakuName,			//性格の名前

    EvCmdSxyPosChange,
    EvCmdObjPosChange,
    EvCmdSxyMoveCodeChange,
    EvCmdSxyDirChange,
    EvCmdSxyExitPosChange,
    EvCmdSxyBgPosChange,
    EvCmdObjDirChange,

    EvCmdTimeWaitIconAdd,
    EvCmdTimeWaitIconDel,

    EvCmdReturnScriptWkSet,

    EvCmdABKeyTimeWait,

    EvCmdPokeListSetProc,
    EvCmdUnionPokeListSetProc,
    EvCmdPokeListGetResult,

	EvCmdPokeStatusSetProc,
    EvCmdPokeStatusGetResult,

    EvCmdTemotiMonsNo,
    EvCmdMonsOwnChk,

    EvCmdGetPokeCount2,			//手持ちポケモン数取得
    EvCmdGetPokeCount3,			//手持ちポケモン数取得
    EvCmdGetPokeCount4,			//手持ちポケモン数取得
    EvCmdGetTamagoCount,		//手持ちタマゴ数取得

    EvCmdSubMyGold,				//育てや関連一式
    EvCmdHikitoriPoke,
    EvCmdFldKeepPokeAdd,
    EvCmdFldKeepPokeReturnCheck,
    EvCmdDelPokemon,
    EvCmdDelSodateyaEgg,
    EvCmdGetSodateyaEgg,
    EvCmdHikitoriRyoukin,
    EvCmdCompMyGold,
    EvCmdTamagoDemo,
    EvCmdShopSetProc,			//ショップ画面呼び出し
    EvCmdSodatePokeLevelStr,
    EvCmdMsgAzukeSet,
    EvCmdSetSodateyaPoke,

    EvCmdObjVisible,			//OBJ表示、不表示
    EvCmdObjInvisible,

    EvCmdMailBox,				///<メールボックス呼び出し
    EvCmdGetMailBoxDataNum,		///<メールボックス内のデータ数を取得
    EvCmdRankingView,			///<ギネスホールランキングView

    EvCmdGetTimeZone,
    EvCmdGetRand,				//ランダム取得
    EvCmdGetRandNext,			//ランダム取得

	EvCmdGetNatsuki,			//なつき度取得
    EvCmdAddNatsuki,			//なつき度増やす
    EvCmdSubNatsuki,			//なつき度減らす

	EvCmdHikitoriListNameSet,		//引き取りポケモン名をセット

    EvCmdPlayerDirGet,

    EvCmdGetSodateyaAishou,		//そだてや：2体の相性ゲット
    EvCmdGetSodateyaTamagoCheck,	//そだてや：たまごがうまれているか

    EvCmdTemotiPokeChk,
    EvCmdOokisaRecordChk,
    EvCmdOokisaRecordSet,
    EvCmdOokisaTemotiSet,
    EvCmdOokisaKirokuSet,

    EvCmdWazaListSetProc,
    EvCmdWazaListGetResult,
    EvCmdWazaCount,
    EvCmdWazaDel,
    EvCmdTemotiWazaNo,
    EvCmdTemotiWazaName,

    EvCmdSysFlagKairiki,
    EvCmdSysFlagFlash,
    EvCmdSysFlagKiribarai,

    EvCmdImcAcceAddItem,
    EvCmdImcAcceAddItemChk,
    EvCmdImcAcceCheckItem,
    EvCmdImcBgAddItem,
    EvCmdImcBgCheckItem,

    EvCmdBTowerAppSetProc,

    EvCmdBattleTowerWorkClear,
    EvCmdBattleTowerWorkInit,
    EvCmdBattleTowerWorkRelease,
    EvCmdBattleTowerTools,
    EvCmdBattleTowerGetSevenPokeData,
    EvCmdBattleTowerIsPrizeGet,
    EvCmdBattleTowerIsPrizemanSet,
    EvCmdBattleTowerSendBuf,
    EvCmdBattleTowerRecvBuf,
    EvCmdBattleTowerGetLeaderRoomID,
    EvCmdBattleTowerIsLeaderDataExist,

    EvCmdRecordInc,
    EvCmdRecordGet,
    EvCmdRecordSet,

    EvCmdZukanChkJohto,
    EvCmdZukanChkNational,
    EvCmdZukanRecongnize,

    EvCmdPokeMailChk,
    EvCmdPaperplaneSet,
    EvCmdPokeMailDel,
    EvCmdKasekiCount,
    EvCmdCallPGearTelParamSet,
    EvCmdCallPGear,
    EvCmdItemNoToMonsNo,
    EvCmdKasekiItemNo,

    EvCmdPokeLevelChk,
    EvCmdApprovePoisonDead,			//どく気絶チェック
    EvCmdFinishMapProc,				//フィールドマッププロセス終了
    EvCmdDebugWatch,				//デバッグ用ワーク内容表示（デバッガのコマンドラインへ）

	EvCmdGetOtherMsgArcID,			//拡張gmmアーカイブID取得
    EvCmdTalkMsgAllPutOtherArc,		//TALKMSG_ALLPUTアーカイブ指定あり
    EvCmdTalkMsgOtherArc,			//TALKMSG_ALLPUTアーカイブ指定あり
    EvCmdTalkMsgAllPutPMS,			//簡易会話パラメータ
    EvCmdTalkMsgPMS,				//簡易会話パラメータ
    EvCmdTalkMsgTowerApper,			//バトルタワー対戦前メッセージ
    EvCmdTalkMsgNgPokeName,			//タワーNGポケモン名展開

    EvCmdGetBeforeZoneID,
    EvCmdGetNowZoneID,

    EvCmdSafariControl,				//Safari制御コマンド

    EvCmdColosseumMapChangeIn,
    EvCmdColosseumMapChangeOut,

    EvCmdWifiEarthSetProc,

    EvCmdCommGetCurrentID,

    EvCmdPokeWindowPut,
    EvCmdPokeWindowDel,
    EvCmdBtlSearcherDirMvSet,

    EvCmdMsgAutoGet,				//簡単メッセージ表示
    EvCmdPlayerHeightValid,			//自機高さ取得有無

    EvCmdGetPokeSeikaku,
    EvCmdChkPokeSeikakuAll,
	EvCmdToudaiRecoverDemoCall,

    EvCmdGetTelBookFromTrID,
    EvCmdGetTelNumberEntryMsg,
    EvCmdResetRevengeFlag,

    EvCmdStartGenerate,
    EvCmdAddMovePoke,

    EvCmdRandomGroup,				//ランダムグループ関連

    EvCmdRemaindWazaCount,
    EvCmdRemaindWazaListSetProc,
    EvCmdNormalWazaListSetProc,
    EvCmdOboeWazaListGetResult,

    EvCmdFldTradeAlloc,
    EvCmdFldTradeMonsno,
    EvCmdFldTradeChgMonsno,
    EvCmdFldTradeEvent,
    EvCmdFldTradeDel,
    EvCmdZukanTextVerUp,
    EvCmdZukanSexVerUp,
    EvCmdZenkokuZukanFlag,

    EvCmdChkRibbonCount,
    EvCmdChkRibbonCountAll,
    EvCmdChkRibbon,
    EvCmdSetRibbon,
    EvCmdRibbonName,
    EvCmdChkPrmExp,
    EvCmdChkWeek,

    EvCmdRegulationListCall,

    EvCmdDummy,
    EvCmdPcRecoverAnm,
    EvCmdElevatorAnm,

    EvCmdMysteryPostMan,			//ふしぎな贈り物配達員

    EvCmdDebugPrintWorkStationed,
    EvCmdDebugPrintFlagStationed,

    EvCmdPMSInputProc,				//簡易会話入力（単語一つ&バトルメッセージ）
    EvCmdPMSInputDoubleProc,		//簡易会話入力（単語二つ）
    EvCmdPMSBuf,					//簡易会話の単語メッセージをバッファへ

    EvCmdPMVersionGet,

    EvCmdFrontPokemon,
    EvCmdTemotiPokeType,
    EvCmdAikotobaKabegamiSet,
	EvCmdGetAikotobaEgg,

    EvCmdSetUpPasoAnime,
    EvCmdStartPasoOnAnime,
    EvCmdStartPasoOffAnime,

    EvCmdGetKujiAtariNum,
    EvCmdKujiAtariChk,
    EvCmdKujiAtariInit,
    EvCmdNickNamePC,

    EvCmdPokeBoxCountEmptySpace,

    EvCmdPokeParkControl,
    EvCmdPokeParkDepositCount,
    EvCmdPokeParkTransMons,
    EvCmdPokeParkGetScore,

    EvCmdReportDrawProcSet,
    EvCmdReportDrawProcDel,

    EvCmdDendouBallAnm,

    EvCmdAddScore,
    EvCmdAcceName,

    EvCmdPartyMonsNoCheck,			// パーティに引数１のポケモンがいるかチェック
    EvCmdPartyDeokisisuFormChange,	// パーティ内のデオキシスのフォルムを変更
    EvCmdCheckMinomuchiComp,	// ミノムッチ3種そろったか

    EvCmdPoketchHookSet,
    EvCmdPoketchHookReset,

    EvCmdGetNowHour,

    EvCmdObjShakeAnm,
    EvCmdObjBlinkAnm,
    EvCmd_D20R0106Legend_IsUnseal,

    EvCmdDressingImcAcceCheck,
    EvCmdTalkMsgUnknownFont,		//アンノーンフォントでメッセージ出力
    EvCmdAgbCartridgeVerGet,	// ささっているAGBカートリッジVer取得

    EvCmdFrontPokemon2,			//先頭ポケモン（タマゴ、瀕死を除く）

    EvCmdHideMapStateChange,	//隠しマップチェンジ

    EvCmdImcBgNameSet,		// イメージクリップ背景名をバッファに設定
    EvCmdCompCoin,
    EvCmdAddCoinChk,
    EvCmdLevelJijiiNo,
    EvCmdPokeLevelGet,
    EvCmdImcAcceSubItem,
    EvCmdLevelJijiiInit,

    EvCmdNewNankaiWordSet,
    EvCmdRegularCheck,
    EvCmdNankaiWordCompleteCheck,
    EvCmdNumberNameEx,		//数字タグ展開ディスプレイモード指定版
    EvCmdTemotiPokeContestStatusGet,

    EvCmdBirthDayCheck,
    EvCmdSndInitialVolSet,
    EvCmdAnoonGetNum,
    EvCmdIsHaihuEventEnable,

    EvCmdPokeWindowPutPP,
    EvCmdPokeWindowAnm,
    EvCmdPokeWindowAnmWait,
    EvCmdDendouNumGet,

    EvCmdSodateyaPokeListSetProc,
    EvCmdSodateyaPokeListGetResult,

    EvCmdGetRandomHit,

	//バトルポイント関連ここから
    EvCmdCheckBtlPoint,
    EvCmdAddBtlPoint,
    EvCmdSubBtlPoint,
    EvCmdCompBtlPoint,
    //バトルポイント関連ここまで
    EvCmdUnionViewGetTrainerTypeNo,

    EvCmdBmpMenuMakeList16,

    EvCmdHidenEffStart,
	EvCmdZishinEffectPlay,

    EvCmdTrainerMultiBattleSet,

    EvCmdObjAnimePos,

    EvCmdCheckMyGSID,
    EvCmdGetFriendDataNum,
    EvCmdNpcTradePokeListSetProc,

    EvCmdGetCoinGift,
    EvCmdAusuItemCheck,
    EvCmdSubWkCoin,
    EvCmdCompWkCoin,
    EvCmdAikotobaOkurimonoChk,

	EvCmdCBSealKindNumGet,

	EvCmdWifiHusiginaokurimonoOpenFlagSet,
    EvCmdMoveCodeGet,

    EvCmdBgmPlayCheck,
    EvCmdUnionGetCardTalkNo,

    EvCmdWirelessIconEasy,
    EvCmdWirelessIconEasyEnd,

    EvCmdSaveFieldObj,

    EvCmdSealName,

	EvCmdTalkObjPauseAll,

	EvCmdSetEscapeLocation,
    EvCmdFieldObjBitSetFellowHit,

    EvCmdDameTamagoChkAll,

    EvCmdUnionBmpMenuStart,
    EvCmdUnionBattleStartCheck,
    EvCmdCommDirectEndTiming,
    EvCmdHaifuPokeRetryCheck,
    EvCmdSpWildBattleSet,
    EvCmdGetCardRank,
    EvCmdBicycleReqNonBgm,

    EvCmdTalkMsgSpAuto,

    EvCmdReportInfoWinOpen,
    EvCmdReportInfoWinClose,

    EvCmdFieldScopeModeSet,

    EvCmdPairPoke_CheckBig,
    EvCmdPairPoke_TestBallon,
    EvCmdPairPoke_ChangePosition,
    EvCmdPairPoke_PCCounterJumpAnm,
	EvCmdPairPoke_BallIn,
    EvCmdPairPoke_TalkStart,
	EvCmdPairPoke_PauseCnt,
	EvCmdPairPoke_WaitAnime,
	EvCmdPairPoke_ChangeMoveCode,
	EvCmdPairPoke_SetPlayerSidePos,
	EvCmdPairPoke_SetPlayerPos,
	EvCmdPairPoke_SetPlayerPosNoSt,
	EvCmdPairPoke_Appear,
	EvCmdPairPoke_SetGridCenter,

	EvCmdMoveSeamlessCamera,

	EvCmdCallPokethlonProc,
	EvCmdFldTradeChgMonsSex,

	EvCmdGetRevengeItem,
	EvCmdGetTelItemEvData,

	EvCmdTakePicture,
	EvCmdGetPictureDataNum,
	EvCmdPhotoAlbumCall,
	EvCmdIsAlbumFull,			/// フォトアルバムがいっぱいかどうか調べる

	EvCmdSysFlagDisguiseGet,
	EvCmdSysFlagDisguiseSet,

	EvCmdSetupLaboMOnsBall,

	EvCmdObjDirGet,

	EvCmdBonguriGetAnm,
	EvCmdGetBongColorNo,
	EvCmdAddBonguri,
	EvCmdBonguriName,

//PLATINUM_ADD
	EvCmdFrontierSystemCall,
	EvCmdFactorySetContinueNG,

	EvCmdGuru2SetProc,
	EvCmdUnionGetRomCode,
	EvCmdFrontierMonitor,

	EvCmdTemotiPokeChkNum,
	EvCmdBattleStageTools,

	EvCmdBattleStageCommMonsNo,
	EvCmdBattleStagePokeListGetResult,
	EvCmdBattleStageSetContinueNG,

	EvCmdBattleCastleTools,
	EvCmdBattleCastleCommMonsNo,
	EvCmdBattleCastlePokeListGetResult,
	EvCmdBattleCastleSetContinueNG,

	EvCmdExtraSaveInit,
	EvCmdExtraSaveInitCheck,

	EvCmdBattleRouletteTools,
	EvCmdBattleRouletteCommMonsNo,
	EvCmdBattleRoulettePokeListGetResult,
	EvCmdBattleRouletteSetContinueNG,

	EvCmdTemotiPokeChkGetPos,

	EvCmdSeisekiBmpListStart,			//バトルステージのポケモンリスト

	EvCmdScratch,
	EvCmdScratchFree,
	EvCmdScratchItemGet,

	//技教え
	EvCmdWazaOshieDataPageCount,
	EvCmdWazaOshieBmpListStart,
	EvCmdWazaOshieChgPokeWaza,
	EvCmdWazaOshieGetBP,
	EvCmdWazaOshieZutukiCheck,

	//トップブリーダー
	EvCmdTopBreederPowRndGet,
	EvCmdStatusName,

	//ロトム
	EvCmdPokeFormChange,

	EvCmdTrainerName,

	EvCmdNumberNameEx32,

	EvCmdGdsSetProc,

	EvCmdWiFiLobbySetProc,	// WiFi広場開始
	EvCmdSndDemo01DataLoad,
	EvCmdSndFieldDataLoad,
	EvCmdSndNowBgmNoGet,

	EvCmdContABKey,

	EvCmdTypeName,
	EvCmdGetItemNum,
	EvCmdMezameruPawaaTypeGet,

	EvCmdSetFavoritePoke,
	EvCmdGetFavoritePoke,
	EvCmdRotomuFormCheck,
	EvCmdTemotiRotomuFormChangeGet,
	EvCmdRotomuFormWazaChange,
	EvCmdTemotiRotomuFormNoGet,

	EvCmdBmpListStartLpCp,

	EvCmdVanishDummyObjAdd2,
	EvCmdVanishDummyObjDel2,

	EvCmdScoreAdd,

	EvCmdProfileBoyEvent,

	EvCmdHeapCheck,
	EvCmdBattleResultGet,

	EvCmdGetWeather,

	EvCmdPlayerPosAllGet,
	EvCmdEventGetWildBattleSet,
	EvCmdZukanSeeSet,

	EvCmdEventGetTemotiPokeChkGetPos,

	EvCmdUnionPokeFormReturn,
	EvCmdSodateyaPokeFormReturn,

	EvCmdWflbyCounterTime,

	EvCmdBattleStageNumberName,
	EvCmdBattleStageRecordPokeGet,
	EvCmdBattleStageTotalRecordGetEx,

	EvCmdBmpListStartWidth,
	EvCmdGirathinaFormUpdate,

	EvCmdTVStageRensyouCheck,

	EvCmdHaihuPokeCheck,

	EvCmdFldOBJAllHeightVanishOFF,
	EvCmdFldOBJAllHeightVanishON,

	EvCmdTemotiItemChk,
	EvCmdWifiHistory,

	EvCmdSndPlayerVolume,
	EvCmdRecordAdd,
	EvCmdRecordAddU32,

	EvCmdPcDendouDataCheck,
	EvCmdGetPokeSeeFlag,
//PLATINUM_ADD

	EvCmdPlayerPosEffectPlay,	//アジト　ポケモン床エフェクト
	EvCmdAjitoAlarmEffectPlay,	//アジト　警報エフェクト
	EvCmdAjitoD35R0103BMInit,	//アジトB2専用　電波発生装置OBJアニメ制御
	EvCmdPairPoke_SetReaction,	//連れ歩きリアクション

	EvCmdCallPkthRecord,	///<ポケスロンレコード呼び出し
	EvCmdCallAnPuzzle,		///<アンノーンパズル呼び出し
	EvCmdSetAnFontWindow,	///<アンノーンフォントウィンドウ呼び出し

	EvCmdSodateyaObjSet,	///<育てやポケモンオブジェセット

	EvCmdSafariMapLayout,	///<サファリMAPレイアウトツール呼び出し
	EvCmdSafariObjLayout,	///<サファリOBJレイアウトツール呼び出し
	EvCmdSafariObjName,		///<サファリOBJネーム展開
	EvCmdSafariTalkObjGet,	///<サファリ話しかけOBJ取得
	EvCmdSafariObjRemove,	///<サファリ指定OBJをフィールドから削除
	EvCmdIsSafariObjPlace,	///<新規OBJを置けるかチェック

	EvCmdCallLinearDemo,		///<リニアデモ
	EvCmdCallShipDemo,		///<船デモ

	EvCmdGetPkthlnSvData,		///<ポケスロンセーブデータ参照
	EvCmdGetPkthlnFunNumCalc,	///<ポケスロン人気値加減算

	EvCmdFieldSeSetup,		///<環境音再生

	EvCmdCallGetLivingPokeIdxTop,	///戦えるポケモンのリストナンバーを返す
	EvCmdPairPoke_WhiteFlash,		///連れ歩きポケモンを白フラッシュ
	EvCmdIsPairPoke,				///連れ歩きポケモンがいるか？
	EvCmdPairPoke_IsVanish,			///連れ歩きポケモン消えてるか？
	EvCmdPairPoke_SetKairikiEff,	///連れ歩きポケモンかいりき使用エフェクト
	EvCmdPairPoke_AddHumorVal,		///連れ歩きポケ機嫌値加算
	EvCmdPairPoke_CheckType,		///連れ歩きポケのタイプと指定タイプの一致を調べる
	EvCmdPairPoke_JumpAct,			///連れ歩きポケフィールド技使用前ジャンプアクション

	EvCmdGetBonguriBallNum,			///ガンテツに預けたボングリの数
	EvCmdClearBonguriBall,			///ガンテツに預けたパラメータをクリア
	EvCmdExchangeBonguriBall,		///アイテムと交換
	EvCmdGetBonguriAllNum,			///所持しているボングリの総数
	EvCmdCallBongCaseModeBall,		///ボングリケース呼び出し
	EvCmdCallBongCaseModeShop,		///ボングリケース　ショップモード呼び出し
	EvCmdBongJuiceShopGetParam,		///ボンジュース ショップパラメータ取得

	EvCmdPokeLvUpWazaCheck,			///ポケモンが指定の技をレベルアップで覚えるか
	EvCmdPkthRecWinCall,			///ポケスロンレコードウィンドウ表示
	EvCmdPkthStatueObjSet,			///ポケスロン　友情の間　石像セット
	EvCmdPkthCourseName,			///ポケスロンコースネームタグ展開

	EvCmdCall_SubLcdSelectStart,	/// 下画面選択システム画面切り替え
	EvCmdCall_SubLcdSelectEnd,		/// 下画面選択システム画面終了
	EvCmdTouchYesNoWin,				/// 下画面はい・いいえ
	EvCmdTouchBmpListInit,			/// 下画面選択リスト初期化
	EvCmdTouchBmpListInitEx,		/// 下画面選択リスト初期化（メッセージマネージャー渡し済み版）
	EvCmdTouchBmpListMakeList,		/// 下画面選択リスト項目追加
	EvCmdTouchBmpListStart,			/// 下画面選択リスト開始
	EvCmdRockRslt,					///岩砕き使用後イベント
	EvCmdHeadRslt,					///頭突き使用後イベント

	EvCmdAllocLegFldDemoWork,		///伝説系フィールドデモ	ワーク確保
	EvCmdFreeLegFldDemoWork,		///伝説系フィールドデモ	ワーク解放
	EvCmdAppLegBell,				///伝説系フィールドデモ	鈴出現
	EvCmdAppLegReso,				///伝説系フィールドデモ	共鳴
	EvCmdAppLegEyes,				///伝説系フィールドデモ	ルギア目
	EvCmdStartLegMapBellAnm,		///伝説系フィールドデモ	マップ付属鈴発光
	EvCmdSetLegCam,					///伝説系フィールドデモ	カメラセット
	EvCmdMoveLegCam,				///伝説系フィールドデモ	カメラ移動
	EvCmdMoveLegCamWait,			///伝説系フィールドデモ	カメラ移動待ち
	EvCmdDescendLegPoke,			///伝説系フィールドデモ	ポケ降臨
	EvCmdStartLegWeather,			///伝説系フィールドデモ 天候開始
	EvCmdEndLegWeather,				///伝説系フィールドデモ 天候終了
	EvCmdInitLegAfApp,			///伝説系フィールドデモ アプリデモ終了後メモリ確保
	EvCmdEndLegAfApp,			///伝説系フィールドデモ アプリデモ終了後メモリ解放
	EvCmdReturnLegCamera,			///伝説系フィールドデモ フリームーブのためのカメラ戻し

	EvCmdAnnoonGetFormAtoZIsComp,	/// アンノーンAtoZをゲットしたか？

    EvCmdPokethlonShopCall, 		/// ポケスロンショップ
    EvCmdPokethlonCardShopCall, 	/// ポケスロンレコードショップ

	EvCmdCallLegendDemo,			/// 伝説デモ（アプリ）
	EvCmdLegendFeatherEffectPlay,	/// 伝説の羽根エフェクト呼び出し
	EvCmdT29WataruSoratobiDemoPlay,	/// T29ワタルのカイリュー空を飛ぶデモ呼び出し

	EvCmdGetUtsugiTogepii,			/// ウツギのトゲピーゲット
	EvCmdIsUtsugiTogepii,			/// ウツギのトゲピーかどうか調べる
	EvCmdGetGizamimiPityuu,			/// ギザミミピチューゲット
	EvCmdRadioCheck,				/// ラジオ番組チェック
	EvCmdCallSlot,					/// スロットアプリコール
	EvCmdIsEventMailExist,			/// メールポケモン専用メールデータがセーブ内にあるか？

	EvCmdShopSaleCall,		/// ショップ売る
	EvCmdPairPoke_AppForbdn,		///　連れ歩きポケ出現禁止フラグ
	EvCmdOverlaySet,			///<指定オーバーレイロード/アンロード

	EvCmdMushitoriSysControl,			///<虫取り大会 ワークセット/リリース
	EvCmdMushitoriRankingDataBufSet,	///<虫取り大会 ランキングデータバッファセット
	EvCmdMushitoriGetMyResult,			///<虫取り大会 自分の順位ともらえるアイテム、モンスターナンバーを取得
	EvCmdMushitoriCapturePokeGet,		///<虫取り大会 捕まえたポケモンを手持ちorボックスに追加
	EvCmdMushitoriRestTimeSet,			///<虫取り大会 残り時間をバッファにセット
	EvCmdMushitoriTrainerEntryCheck,	///<虫取り大会 エントリーしているトレーナーをチェック

	EvCmdSafariMissionClearCheck,		///<サファリ　ミッションクリアチェック
	EvCmdSafariEventKeyTimeSet,			///<サファリ　イベントキータイム設定

	EvCmdNumSelSubLCDCall,				///<下画面数値選択
	EvCmdCompDeposit,					///<お母さんの貯金を調べる
	EvCmdDepositWinWrite,				///<貯金ウィンドウ表示
	EvCmdDepositWinDel,					///<貯金ウィンドウ削除
	EvCmdDepositWrite,					///<貯金ウィンドウ再表示

	EvCmdGetRegulationCupName,			///<カップ名をWORDSETする
	EvCmdGetRegulationCupNameWork,		///<カップ名をWORDSETする（ワーク指定）
	EvCmdRegulationSet,					///<レギュレーション設定
	EvCmdRegulationWinPut,				///<ルール表示
	EvCmdRegulationWinDel,				///<ルール非表示
	EvCmdRegulationPokeCheck,			///<参加できるポケモンがそろっているか

	EvCmdSetPGearMapOpenLevel,			///<ポケギア　マップのオープンレベルセット
	EvCmdLoadSeSceneData,				///< ホウオウ・ルギアフィールドイベント用のSE読み込み

	EvCmdSheimiFormRev,					///<シェイミフォルム戻り

	EvCmdTrHouseStIsEnableTrainer,		///<トレーナーハウス 指定IDのトレーナーが有効か？
	EvCmdTrHouseBattleCall,				///<トレーナーハウス バトルコール
	EvCmdTrHouseTalkAppearMsg,			///<トレーナーハウス エンカウントメッセージ再生

	EvCmdTimeLeapEff,					///ときわたりエフェクト

	EvCmdDepositItemStockGet,			///貯金アイテムのストックパラメータ取得
	EvCmdDepositItemStockDel,			///貯金アイテムのストック先頭データを消す
	EvCmdDepositItemStockCheck,			///貯金アイテムストックの有無チェック

	EvCmdNamiBGMForbdn,					///波乗り曲禁止
	EvCmdCall_SubLcdSelectReserve,		/// 下画面選択システム復帰時予約（メニューか選択肢システムか）

	EvCmdAnnoeneEff,					///アンノーン飛び回りエフェクト
	EvCmdFlashBallEff,					///アルセウス発光体エフェクト
	EvCmdInitArceusGmk,					///シント遺跡ギミック初期化
	EvCmdVanishArceusGmk,				///シント遺跡ギミック非表示
	EvCmdChgArceusGmkAnm,				///シント遺跡ギミックアニメ変更

	EvCmdAoiAikotobaParamGet,			//アオイの合言葉データ取得

	EvCmdSafari_DataTrans,     ///サファリデータ転送
	EvCmdGetSafariNameWork,	   ///<カップ名をWORDSETする（ワーク指定）
	EvCmdIsSafariDataAndDelete,		   ///<サファリデータがあるのかどうか

	EvCmdCheckPokeLeafCrown,	///<ポケモンの葉っぱと王冠をチェック
	EvCmdSetPokeLeafCrown,		///<ポケモンに王冠追加
	EvCmdGetPokeForm,			///<ポケモンのフォルムゲット
	EvCmdAddPokeContestParam,	///<ポケモンのコンテスト系パラメータを加算

	EvCmdPairPoke_IsNeghbor,		///<連れポケ隣接しているか

	EvCmdAcceGameChkComp,			///<アクセサリーくじ引き：アクセサリーコンプしてる？
	EvCmdAcceGameGetAcceNo,			///<アクセサリーくじ引き：アクセサリーナンバー取得
	EvCmdAcceGameChkImcBgComp,		///<アクセサリーくじ引き：BGコンプしてる？
	EvCmdAcceGameGetImcBgNoRnd,		///<<アクセサリーくじ引き：まだ持っていないイメージクリップ壁紙ナンバーをランダムで返す

    EvCmdPokethlonShopCheck, 		/// ポケスロンショップの在庫チェック
    EvCmdPokethlonCardShopCheck, 	/// ポケスロンレコードショップの在庫チェック
	EvCmdGSKaioogaGuraadonCheck,	/// 手持ちにカイオーガ・グラードンが揃っているか？
	EvCmdMysteryRegulationCheck,  /// 配信レギュレーションを持っているかどうか

	EvDepositCheck,		// 貯金チェック

  EvCmdSetPerapSleepNG, // ぺらっぷ泣き声教え、　スリープ処理のON/OFF

	EvCmdCheckPokecenZoneID,		///<ポケセンチェック

};


//--------------------------------------------------------------------------------------------
///	スクリプトコマンドの最大数
//--------------------------------------------------------------------------------------------
const u32 ScriptCmdMax = NELEMS(ScriptCmdTbl);

//============================================================================================
//
//	基本システム命令
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * ＮＯＰ命令（なにもしない）
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdNop( VM_MACHINE * core )
{
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 何もしない（デバッガで引っ掛けるための命令）
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdDummy( VM_MACHINE * core )
{
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * スクリプトの終了
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdEnd( VM_MACHINE * core )
{
    VM_End( core );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ウェイト処理
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTimeWait( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16 num				= VMGetU16( core );
    u16 wk_id			= VMGetU16( core );
    u16* ret_wk			= GetEventWorkAdrs( fsys, wk_id );

    *ret_wk = num;

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, EvWaitTime );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitTime(VM_MACHINE * core)
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk = GetEventWorkAdrs( fsys, core->reg[0] );	//注意！

    (*ret_wk)--;
    if( *ret_wk == 0 ){
        return 1;
    }
    return 0;
}

//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
static BOOL EvCmdDebugWatch(VM_MACHINE * core)
{
    u16 value = VMGetWorkValue(core);
    OS_Printf("SCR WORK: %d\n", value);
    return 0;
}

//============================================================================================
//
//	データロード・ストア関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 仮想マシンの汎用レジスタに1byteの値を格納
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLoadRegValue( VM_MACHINE * core )
{
    u8	r = VMGetU8( core );
    core->reg[r] = VMGetU8( core );

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 仮想マシンの汎用レジスタに4byteの値を格納
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLoadRegWData( VM_MACHINE * core )
{
    u8	r;
    u32	wdata;

    r = VMGetU8( core );
    wdata = VMGetU32( core );
    core->reg[r] = wdata;
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 仮想マシンの汎用レジスタにアドレスを格納
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLoadRegAdrs( VM_MACHINE * core )
{
    u8	r;
    VM_CODE * adrs;

    r = VMGetU8( core );
    adrs = (VM_CODE *)VMGetU32( core );
    core->reg[r] = *adrs;

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * アドレスの中身に値を代入
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLoadAdrsValue( VM_MACHINE * core )
{
    VM_CODE * adrs;
    u8	r;

    adrs = (VM_CODE *)VMGetU32( core );
    r = VMGetU8( core );
    *adrs = r;

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * アドレスの中身に仮想マシンの汎用レジスタの値を代入
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLoadAdrsReg( VM_MACHINE * core )
{
    VM_CODE * adrs;
    u8	r;

    adrs = (VM_CODE *)VMGetU32( core );
    r = VMGetU8( core) ;
    *adrs = core->reg[r];

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 仮想マシンの汎用レジスタの値を汎用レジスタにコピー
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLoadRegReg( VM_MACHINE * core )
{
    u8	r1, r2;

    r1 = VMGetU8( core );
    r2 = VMGetU8( core );
    core->reg[r1] = core->reg[r2];

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * アドレスの中身にアドレスの中身を代入
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLoadAdrsAdrs( VM_MACHINE * core )
{
    VM_CODE * adr1;
    VM_CODE * adr2;

    adr1 = (VM_CODE *)VMGetU32( core );
    adr2 = (VM_CODE *)VMGetU32( core );
    *adr1 = * adr2;

    return 0;
}


//============================================================================================
//
//	比較命令
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * ２つの値を比較
 *
 * @param	r1		値１
 * @param	r2		値２
 *
 * @retval	"r1 < r2 : MISUS_RESULT"
 * @retval	"r1 = r2 : EQUAL_RESULT"
 * @retval	"r1 > r2 : PLUS_RESULT"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCmpMain( u16 r1, u16 r2 )
{
    if( r1 < r2 ){
        return MINUS_RESULT;
    }else if( r1 == r2 ){
        return EQUAL_RESULT;
    }
    return PLUS_RESULT;
}

//--------------------------------------------------------------------------------------------
/**
 * 仮想マシンの汎用レジスタを比較
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCmpRegReg( VM_MACHINE * core )
{
    u8	r1, r2;

    r1 = core->reg[ VMGetU8(core) ];
    r2 = core->reg[ VMGetU8(core) ];
    core->cmp_flag = EvCmdCmpMain( r1, r2 );

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 仮想マシンの汎用レジスタと値を比較
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCmpRegValue( VM_MACHINE * core )
{
    u8	r1, r2;

    r1 = core->reg[ VMGetU8(core) ];
    r2 = VMGetU8(core);
    core->cmp_flag = EvCmdCmpMain( r1, r2 );

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 仮想マシンの汎用レジスタとアドレスの中身を比較
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCmpRegAdrs( VM_MACHINE * core )
{
    u8	r1, r2;

    r1 = core->reg[ VMGetU8(core) ];
    r2 = *(VM_CODE *)VMGetU32(core);
    core->cmp_flag = EvCmdCmpMain( r1, r2 );

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * アドレスの中身と仮想マシンの汎用レジスタを比較
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCmpAdrsReg( VM_MACHINE * core )
{
    u8	r1, r2;

    r1 = *(VM_CODE *)VMGetU32(core);
    r2 = core->reg[ VMGetU8(core) ];
    core->cmp_flag = EvCmdCmpMain(r1,r2);

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * アドレスの中身と値を比較
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCmpAdrsValue(VM_MACHINE * core)
{
    u8 r1,r2;

    r1 = *(VM_CODE *)VMGetU32(core);
    r2 = VMGetU8(core);
    core->cmp_flag = EvCmdCmpMain(r1,r2);

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * アドレスの中身とアドレスの中身を比較
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCmpAdrsAdrs(VM_MACHINE * core)
{
    u8 r1,r2;

    r1 = *(VM_CODE *)VMGetU32(core);
    r2 = *(VM_CODE *)VMGetU32(core);
    core->cmp_flag = EvCmdCmpMain(r1,r2);

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ワークと値を比較
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCmpWkValue( VM_MACHINE * core )
{
    u16 * wk;
    u16	r1, r2;

    wk = VMGetWork( core );
    r1 = *wk;
    r2 = VMGetU16( core );
    core->cmp_flag = EvCmdCmpMain( r1, r2 );

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ワークとワークを比較
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCmpWkWk( VM_MACHINE * core )
{
    u16 * wk1;
    u16 * wk2;

    wk1 = VMGetWork( core );
    wk2 = VMGetWork( core );
    core->cmp_flag = EvCmdCmpMain( *wk1, *wk2 );

    return 0;
}

//============================================================================================
//
//	仮想マシン関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 仮想マシン追加(切り替えはせず、並列で動作します！)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdVMMachineAdd( VM_MACHINE * core )
{
    u16 id;
    FIELDSYS_WORK* fsys		= core->fsys;
    u8* vm_machine_count	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_VM_MACHINE_COUNT );
    VM_MACHINE** vm			= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_VM_SUB1 );

    id = VMGetU16(core);

    //仮想マシン追加
    //*vm = VMMachineAdd(fsys, id, &ScriptCmdTbl[0], &ScriptCmdTbl[EVCMD_MAX]);
    *vm = VMMachineAdd(fsys, id);
    (*vm_machine_count)++;

    //イベントと切り離したTCB動作にするかも？
    //*vm = VMMachineAddTCB( fsys, id, &ScriptCmdTbl[0], &ScriptCmdTbl[EVCMD_MAX] );

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ローカルスクリプトをウェイト状態にして、共通スクリプトを動作させます
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdChangeCommonScr( VM_MACHINE * core )
{
#if 0
    u16 scr_id;
    FIELDSYS_WORK* fsys		= core->fsys;
    u8* common_scr_flag		= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_COMMON_SCR_FLAG );
    u8* vm_machine_count	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_VM_MACHINE_COUNT );
    VM_MACHINE** vm			= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_VM_SUB1 );

    scr_id = VMGetU16(core);

    //共通スクリプト以外にも切り替え可能になっている！

    //共通スクリプト切り替えフラグON
    *common_scr_flag = 1;

	//仮想マシン追加
    *vm = VMMachineAdd(fsys, scr_id);
    (*vm_machine_count)++;
#else
    u16 scr_id;
    FIELDSYS_WORK* fsys		= core->fsys;
    u8* common_scr_flag		= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_COMMON_SCR_FLAG );
    u8* vm_machine_count	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_VM_MACHINE_COUNT );
    VM_MACHINE** vm			= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_VM_SUB1+(*vm_machine_count-1) );

    scr_id = VMGetU16(core);

    //共通スクリプト以外にも切り替え可能になっている！

	//仮想マシン追加
    *vm = VMMachineAdd(fsys, scr_id);
	(*vm)->id = *vm_machine_count;
    (*vm_machine_count)++;

	//共通スクリプト切り替えフラグON
    *common_scr_flag |= (0x01<<core->id);

	OS_Printf("ChangeCommonScr com_flag = %d, nest_count = %d\n",*common_scr_flag,*vm_machine_count-1);
#endif

    VM_SetWait( core, EvChangeCommonScrWait );
    return 1;
}

//return 1 = 終了
static BOOL EvChangeCommonScrWait(VM_MACHINE * core)
{
    FIELDSYS_WORK* fsys = core->fsys;
    u8* common_scr_flag = GetEvScriptWorkMemberAdrs(fsys,ID_EVSCR_COMMON_SCR_FLAG);

#if 0
    if( *common_scr_flag == 0 ){
        return 1;
    }
#else
    u8* vm_machine_count	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_VM_MACHINE_COUNT );

    if( (*common_scr_flag & (0x01<<core->id)) == 0){
//		OS_Printf("ChangeScrWaitEnd com_flag = %d, nest_count = %d\n",*common_scr_flag,*vm_machine_count-1);
        return 1;
    }
#endif
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 共通スクリプトを終了して、ローカルスクリプトを再開させます
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdChangeLocalScr( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u8* common_scr_flag = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_COMMON_SCR_FLAG );

#if  0
    //共通スクリプト切り替えフラグOFF
    *common_scr_flag = 0;
#else
    u8* vm_machine_count	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_VM_MACHINE_COUNT );
    (*common_scr_flag) ^= (0x01<<(core->id-1));
//	OS_Printf("ChangeLocalScr After com_flag = %02x, nest_count = %d\n",*common_scr_flag,*vm_machine_count-1);
#endif
    //VM_End( core );
    return 0;	//注意！　この後に"END"に行くようにする
}


//============================================================================================
//
//	分岐命令
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * スクリプトジャンプ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * @li	EVCMD_JUMP
 *
 *	表記：	EVCMD_JUMP	JumpOffset(s16)
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGlobalJump( VM_MACHINE * core )
{
    s32	pos;
    pos = (s32)VMGetU32(core);
    VMJump( core, (VM_CODE *)(core->PC+pos) );	//JUMP
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 話し掛け対象OBJID比較ジャンプ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjIDJump( VM_MACHINE * core )
{
    u8 id;
    s32	pos;
    FIELD_OBJ_PTR* fldobj;
    FIELDSYS_WORK* fsys = core->fsys;

    //話し掛け対象OBJ
    fldobj = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_TARGET_OBJ );

    //比較する値
    id = VMGetU8(core);

    //飛び先
    pos = (s32)VMGetU32(core);

    //話し掛け対象OBJと、比較する値が同じか
    if( FieldOBJ_OBJIDGet(*fldobj) == id ){
        VMJump( core, (VM_CODE *)(core->PC+pos) );	//JUMP
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 話し掛け対象BG比較ジャンプ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBgIDJump( VM_MACHINE * core )
{
    u8 id;
    s32	pos;
    //u32 *targetbg;
    u32 targetbg;

    //話し掛け対象BG
    targetbg = Event_GetTargetBg( core->event_work );

    //比較する値
    id = VMGetU8(core);

    //飛び先
    pos = (s32)VMGetU32(core);

    //話し掛け対象BGと、比較する値が同じか
    //if( *targetbg == id ){
    if( targetbg == id ){
        VMJump( core, (VM_CODE *)(core->PC+pos) );	//JUMP
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * イベント起動時の主人公の向き比較ジャンプ
 * (現在の向きではないので注意！)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPlayerDirJump( VM_MACHINE * core )
{
    u8 dir;
    s32	pos;
    int* player_dir;
    FIELDSYS_WORK* fsys = core->fsys;

    player_dir = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_PLAYER_DIR );

    //比較する値
    dir = VMGetU8(core);

    //飛び先
    pos = (s32)VMGetU32(core);

    if( *player_dir == dir ){
        VMJump( core, (VM_CODE *)(core->PC+pos) );	//JUMP
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * スクリプトコール
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * @li	EVCMD_CALL
 *
 *	表記：	EVCMD_CALL	CallOffset(s16)
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGlobalCall( VM_MACHINE * core )
{
    s32	pos = (s32)VMGetU32(core);
    VMCall( core, (VM_CODE *)(core->PC+pos) );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * スクリプトリターン
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdRet( VM_MACHINE * core )
{
    VMRet( core );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * スクリプト条件ジャンプ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdIfJump( VM_MACHINE * core )
{
    u8	r;
    s32	pos;

    r   = VMGetU8(core);
    pos = (s32)VMGetU32(core);

    if( ConditionTable[r][core->cmp_flag] == TRUE ){
        VMJump( core, (VM_CODE *)(core->PC+pos) );
    }
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * スクリプト条件コール
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdIfCall( VM_MACHINE * core )
{
    u8	r;
    s32	pos;

    r   = VMGetU8(core);
    pos = (s32)VMGetU32(core);

    if( ConditionTable[r][core->cmp_flag] == TRUE ){
        VMCall( core, (VM_CODE *)(core->PC+pos) );
    }
    return 0;
}


//============================================================================================
//
//	イベントフラグ関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * フラグのセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFlagSet( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16	flag = VMGetU16( core );
    SetEventFlag( fsys, flag );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * フラグのリセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFlagReset( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16	flag = VMGetU16( core );
    ResetEventFlag( fsys, flag );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * フラグのチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFlagCheck( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16	flag = VMGetU16( core );
    core->cmp_flag = CheckEventFlag( fsys, flag );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ワークの値をフラグナンバーとしてフラグチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFlagCheckWk( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16* wk				= VMGetWork( core );
    u16* ret_wk			= VMGetWork( core );

    *ret_wk = CheckEventFlag( fsys, (*wk) );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ワークの値をフラグナンバーとしてフラグセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFlagSetWk( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16* wk				= VMGetWork( core );
    SetEventFlag( fsys, (*wk) );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ワークの値をフラグナンバーとしてフラグリセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFlagResetWk( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16* wk			= VMGetWork( core );
    ResetEventFlag( fsys, (*wk) );
    return 0;
}


//============================================================================================
//
//	トレーナーフラグ関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * トレーナーフラグのセット(トレーナーIDを渡す)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTrainerFlagSet( VM_MACHINE * core )
{
    u16 flag = VMGetWorkValue(core);	//トレーナーIDを渡す！　ワークナンバーを渡すのはダメ！
    SetEventFlagTrainer( core->fsys->savedata, flag );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * トレーナーフラグのリセット(トレーナーIDを渡す)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTrainerFlagReset( VM_MACHINE * core )
{
    u16 flag = VMGetWorkValue(core);	//トレーナーIDを渡す！　ワークナンバーを渡すのはダメ！
    ResetEventFlagTrainer( core->fsys->savedata, flag );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * トレーナーフラグのチェック(トレーナーIDを渡す)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTrainerFlagCheck( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16 flag = VMGetWorkValue(core);	//トレーナーIDを渡す！　ワークナンバーを渡すのはダメ！

	OS_Printf("TrainerFlagCheck %d \n", flag);
    core->cmp_flag = CheckEventFlagTrainer( fsys->savedata, flag );
	OS_Printf(" ->Result %d = %d\n", flag,core->cmp_flag);
    return 0;
}


//============================================================================================
//
//	ワーク操作関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * ワークに値を足す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWkAdd( VM_MACHINE * core )
{
    u16 * work;
    u16 num;
    work = VMGetWork( core );
    *work += VMGetWorkValue( core );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ワークから値を引く
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWkSub( VM_MACHINE * core )
{
    u16 * work;
    work = VMGetWork( core );
    *work -= VMGetWorkValue( core );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ワークに値を格納
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLoadWkValue( VM_MACHINE * core )
{
    u16 * work;

    work = VMGetWork( core );
    *work = VMGetU16( core );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ワークにワークの値を格納
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLoadWkWk( VM_MACHINE * core )
{
    u16 * wk1;
    u16 * wk2;

    wk1 = VMGetWork( core );
    wk2 = VMGetWork( core );
    *wk1 = *wk2;
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ワークに値かワークの値を格納
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLoadWkWkValue( VM_MACHINE * core )
{
    u16 * work;

    work = VMGetWork( core );
    *work = VMGetWorkValue( core );
    return 0;
}


//============================================================================================
//
//	メッセージ・ウィンドウ関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 登録された単語を使って文字列展開　メッセージ表示
 * ※通信、非通信でメッセージ送りの設定が変わります。
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	常に1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTalkSioMsg( VM_MACHINE * core )
{
    u8 msg_id = VMGetU8(core);							//1byte

    if(CommIsInitialize() == FALSE){
        ScrTalkMsg( core, core->msgman, msg_id, 1, NULL );
    }
    else{
        SCR_TALK_EX_PARAM ex_param;
        ScrTalk_InitExParam( &ex_param, core );
        ex_param.msg_speed = (1);
        ex_param.auto_flag = MSG_AUTO_ON;
        ScrTalkMsg( core, core->msgman, msg_id, 0, &ex_param );
    }
    VM_SetWait( core, TalkMsgWait );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * キーウェイト
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	常に1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdABKeyWait( VM_MACHINE * core )
{
    VM_SetWait( core, EvWaitABKey );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitABKey(VM_MACHINE * core)
{
    if( sys.trg & ( PAD_BUTTON_DECIDE | PAD_BUTTON_CANCEL ) ){
        return 1;
    }

    return 0;
}
//--------------------------------------------------------------------------------------------
/**
 * キーウェイト or 時間待ち
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	常に1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdABKeyTimeWait( VM_MACHINE * core )
{
    core->reg[0] = VMGetWorkValue(core);
    VM_SetWait( core, EvWaitABKeyTime );
    return 1;
}

//キーor時間待ち
static BOOL EvWaitABKeyTime(VM_MACHINE * core)
{
    //if (sys.trg & (PAD_BUTTON_A | PAD_BUTTON_B)) {
    if (sys.trg & (PAD_BUTTON_DECIDE | PAD_BUTTON_CANCEL)) {
        return 1;
    }
    core->reg[0] --;
    if (core->reg[0] == 0) {
        return 1;
    }
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * イベントの最後のキーウェイト
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	常に1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLastKeyWait( VM_MACHINE * core )
{
    VM_SetWait( core, EvWaitLastKey );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitLastKey(VM_MACHINE * core)
{
    //通常終了
    //if( sys.trg & ( PAD_BUTTON_A | PAD_BUTTON_B ) ){
    if( sys.trg & ( PAD_BUTTON_DECIDE | PAD_BUTTON_CANCEL ) ){
        return 1;
    }

#if 1
    //十字キー、スタートボタンのリクエスト処理をする
    if( sys.trg & PAD_KEY_UP ){
        Player_DirSet( core->fsys->player, DIR_UP );
    }else if( sys.trg & PAD_KEY_DOWN ){
        Player_DirSet( core->fsys->player, DIR_DOWN );
    }else if( sys.trg & PAD_KEY_LEFT ){
        Player_DirSet( core->fsys->player, DIR_LEFT );
    }else if( sys.trg & PAD_KEY_RIGHT ){
        Player_DirSet( core->fsys->player, DIR_RIGHT );
    }
// 09.04.23 GSではなくなりました。 by hosaka genya
//	else if( sys.trg & PAD_BUTTON_X ){
//      SetEvScriptNextFunc( core->fsys );
//  }
	else{
        return 0;
    }

    return 1;
#else
    return 0;
#endif
}

//--------------------------------------------------------------------------------------------
/**
 * イベントの最後のキーウェイト(その後にアニメが続く時に使用)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	常に1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdNextAnmLastKeyWait( VM_MACHINE * core )
{
    VM_SetWait( core, EvWaitNextAnmLastKey );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitNextAnmLastKey(VM_MACHINE * core)
{
    //if( sys.trg & ( PAD_BUTTON_A | PAD_BUTTON_B ) ){
    if( sys.trg & ( PAD_BUTTON_DECIDE | PAD_BUTTON_CANCEL ) ){
        return 1;
    }

    //十字キーでもメッセージ送り
    if( sys.trg & ( PAD_KEY_UP | PAD_KEY_DOWN | PAD_KEY_LEFT | PAD_KEY_RIGHT ) ){
        return 1;
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 会話ウィンドウを開く
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTalkWinOpen( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u8* win_open_flag	= GetEvScriptWorkMemberAdrs( fsys,ID_EVSCR_WIN_OPEN_FLAG );

    FldTalkBmpAdd(fsys->bgl, GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_MSGWINDAT ),FLD_MBGFRM_FONT);
    FieldTalkWinPut( GetEvScriptWorkMemberAdrs(fsys,ID_EVSCR_MSGWINDAT),
                     SaveData_GetConfig(core->fsys->savedata) );
	fsys->sublcd_menu_next_flag = 1;
    *win_open_flag = 1;	//ON;
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 会話ウィンドウを閉じる
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTalkWinClose( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    GF_BGL_BMPWIN* pMsgWinDat = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_MSGWINDAT );
    u8* win_open_flag	= GetEvScriptWorkMemberAdrs( fsys,ID_EVSCR_WIN_OPEN_FLAG );

    BmpTalkWinClear( pMsgWinDat, WINDOW_TRANS_ON );
    GF_BGL_BmpWinDel( pMsgWinDat );
	fsys->sublcd_menu_next_flag = 0;
    *win_open_flag = 0;	//OFF
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 会話ウィンドウを閉じる(クリアなし)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTalkWinCloseNoClear( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    GF_BGL_BMPWIN* pMsgWinDat = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_MSGWINDAT );
    u8* win_open_flag	= GetEvScriptWorkMemberAdrs( fsys,ID_EVSCR_WIN_OPEN_FLAG );

    //BmpTalkWinClear( pMsgWinDat, WINDOW_TRANS_ON );
    GF_BGL_BmpWinDel( pMsgWinDat );
	fsys->sublcd_menu_next_flag = 0;
    *win_open_flag = 0;	//OFF
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * BGスクロール
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 *
 * REG	0-3
 * TMP	0,1
 * を使用しているので注意！
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBgScroll( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16* reg0			= GetEvScriptWorkMemberAdrs( fsys,ID_EVSCR_WK_REG0 );
    u16* tmp0			= GetEvScriptWorkMemberAdrs( fsys,ID_EVSCR_WK_TEMP0 );
    u16* reg1			= GetEvScriptWorkMemberAdrs( fsys,ID_EVSCR_WK_REG1 );
    u16* reg2			= GetEvScriptWorkMemberAdrs( fsys,ID_EVSCR_WK_REG2 );
    u16* tmp1			= GetEvScriptWorkMemberAdrs( fsys,ID_EVSCR_WK_TEMP1 );
    u16* reg3			= GetEvScriptWorkMemberAdrs( fsys,ID_EVSCR_WK_REG3 );

    *reg0 = VMGetU8(core);	//Xスクロール値
    *tmp0 = VMGetU8(core);	//Xカウンタ
    *reg1 = VMGetU8(core);	//Xスクロール方向

    *reg2 = VMGetU8(core);	//Yスクロール値
    *tmp1 = VMGetU8(core);	//Yカウンタ
    *reg3 = VMGetU8(core);	//Yスクロール方向

    VM_SetWait( core, EvBgScrollWait );

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * BGスクロール終了待ち
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @retval	"0 = 動作中"
 * @retval	"1 = 終了"
 *
 * REG	0-3
 * TMP	0,1
 * を使用しているので注意！
 */
//--------------------------------------------------------------------------------------------
static BOOL EvBgScrollWait( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = core->fsys;

    u16* scroll_x	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WK_REG0 );
    u16* mv_x		= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WK_REG1 );
    u16* scroll_y	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WK_REG2 );
    u16* mv_y		= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WK_REG3 );
    u16* count_x	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WK_TEMP0 );
    u16* count_y	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WK_TEMP1 );

    if( *count_x == 0 && *count_y == 0 ){
        return 1;	//終了
    }

    if( *scroll_x != 0 ){
        if( *mv_x == 0 ){
            GF_BGL_ScrollSet( fsys->bgl, FLD_MBGFRM_FONT, GF_BGL_SCROLL_X_INC, *scroll_x );
        }else{
            GF_BGL_ScrollSet( fsys->bgl, FLD_MBGFRM_FONT, GF_BGL_SCROLL_X_DEC, *scroll_x );
        }
    }

    if( *scroll_y != 0 ){
        if( *mv_y == 0 ){
            GF_BGL_ScrollSet( fsys->bgl, FLD_MBGFRM_FONT, GF_BGL_SCROLL_Y_INC, *scroll_y );
        }else{
            GF_BGL_ScrollSet( fsys->bgl, FLD_MBGFRM_FONT, GF_BGL_SCROLL_Y_DEC, *scroll_y );
        }
    }

    if( *count_x != 0 ){
        (*count_x)--;
    }

    if( *count_y != 0 ){
        (*count_y)--;
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 看板作成（タウンマップ、標識、表札）
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBoardMake( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys;
    STRBUF** ptmp;
    STRBUF** pbuf;
    WORDSET** wordset;
    u16	map;
    u16	wk_id;
    u8	type;
    u8	msg_id;

    fsys = core->fsys;
    ptmp = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_TMPBUF );
    pbuf = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_MSGBUF );
    wordset = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );
    msg_id = VMGetU8(core);
    type = VMGetU8( core );
    map  = VMGetU16( core );
    wk_id = VMGetU16( core );

	fsys->sublcd_menu_next_flag = 1;

/*
    if (map == 0) {
        //絵柄の指定が０の場合、OBJのパラメータから絵柄指定を取得する
        //話し掛け対象OBJ
        FIELD_OBJ_PTR *fldobj = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_TARGET_OBJ );
        map = FieldOBJ_ParamGet(*fldobj, FLDOBJ_PARAM_0);
        OS_Printf("OBJID:%d PARAM0:%d X:%d Z:%d\n", FieldOBJ_OBJIDGet(*fldobj),
                  FieldOBJ_ParamGet(*fldobj, FLDOBJ_PARAM_0),
                  FieldOBJ_NowPosGX_Get(*fldobj), FieldOBJ_NowPosGZ_Get(*fldobj));
    }
*/

    BoardDataSet( fsys->board, type, map );
    BoardSetRequest( fsys->board, BOARD_REQ_ADD );
    BoardMain( fsys );

    MSGMAN_GetString( core->msgman, msg_id, *ptmp );
    WORDSET_ExpandStr( *wordset, *pbuf, *ptmp );

	GF_STR_PrintColor(
		BoardWinGet(fsys->board), FONT_TALK, *pbuf,
		0, 0, MSG_ALLPUT, GF_PRINTCOLOR_MAKE(2,10,15), NULL );

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 看板作成（掲示板用）
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdInfoBoardMake( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys;
    u16 map;
    u8 type;

    fsys = core->fsys;
    type = VMGetU8( core );
    map  = VMGetU16( core );

	fsys->sublcd_menu_next_flag = 1;

    BoardDataSet( fsys->board, type, map );
    BoardSetRequest( fsys->board, BOARD_REQ_ADD );

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 看板制御リクエスト
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBoardReq( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys;
    u8 req;

    fsys = core->fsys;
    req  = VMGetU8( core );

    BoardSetRequest( fsys->board, req );

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 看板リクエスト終了待ちセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @retval	"0 = 終了している"
 * @retval	"1 = 処理中"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBoardWait( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = core->fsys;

    if( BoardReqEndCheck( fsys->board ) == TRUE ){
        return 0;
    }
    VM_SetWait( core, BoardReqWait );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 看板リクエスト終了待ち
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @retval	"0 = 動作中"
 * @retval	"1 = 終了"
 */
//--------------------------------------------------------------------------------------------
static BOOL BoardReqWait( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = core->fsys;

    if( BoardReqEndCheck( fsys->board ) == TRUE ){
        return 1;
    }
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 看板メッセージ表示
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @retrn	1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBoardMsg( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys		= core->fsys;
    u8* msg_index			= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_MSGINDEX );
    STRBUF** ptmp			= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_TMPBUF );
    STRBUF** pbuf			= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_MSGBUF );
    WORDSET** wordset		= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );
    u8	msg_id				= VMGetU8(core);
    u16 wk_id				= VMGetU16( core );

    MSGMAN_GetString( core->msgman, msg_id, *ptmp );

    //登録された単語を使って文字列展開する
    WORDSET_ExpandStr( *wordset, *pbuf, *ptmp );

    //看板TCB保存
	MsgPrintSkipFlagSet( 1 );
	MsgPrintAutoFlagSet( MSG_AUTO_OFF );
	MsgPrintTouchPanelFlagSet( MSG_TP_OFF );
	*msg_index = GF_STR_PrintColor(
					BoardWinGet(fsys->board), FONT_TALK, *pbuf, 0, 0,
					CONFIG_GetMsgPrintSpeed( SaveData_GetConfig(fsys->savedata) ),
					GF_PRINTCOLOR_MAKE(2,10,15), NULL );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, BoardMsgWait );

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * メッセージ終了待ち
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @retval	"0 = 動作中"
 * @retval	"1 = 終了"
 *
 * @li	ANSWK = 0 : キャンセル
 * @li	ANSWK = 1 : メニューへ
 * @li	ANSWK = 2 : 通常終了
 */
//--------------------------------------------------------------------------------------------
static BOOL BoardMsgWait( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u8* msg_index		= GetEvScriptWorkMemberAdrs( fsys,ID_EVSCR_MSGINDEX );
    u16* ret_wk			= GetEventWorkAdrs( fsys, core->reg[0] );	//注意！
    u8	type			= BoardTypeGet( fsys->board );
    int	dir = 0xffff;

    // 通常終了
    if( FldTalkMsgEndCheck( *msg_index ) == 1 ){
        *ret_wk = 2;
        return 1;
    }
/*
	// キャンセル
	if( sys.trg & ( PAD_KEY_UP|PAD_KEY_DOWN|PAD_KEY_LEFT|PAD_KEY_RIGHT ) ){
		GF_STR_PrintForceStop( *msg_index );
     *ret_wk = 0;
		return 1;
	}
*/
    // 十字キーのリクエスト処理
    if( sys.trg & PAD_KEY_UP ){
        dir = DIR_UP;
    }else if( sys.trg & PAD_KEY_DOWN ){
        dir = DIR_DOWN;
    }else if( sys.trg & PAD_KEY_LEFT ){
        dir = DIR_LEFT;
    }else if( sys.trg & PAD_KEY_RIGHT ){
        dir = DIR_RIGHT;
    }
    if( dir != 0xffff ){
        GF_STR_PrintForceStop( *msg_index );
        Player_DirSet( core->fsys->player, dir );
        *ret_wk = 0;
		core->fsys->sublcd_menu_next_flag = 0;
        return 1;
    }

	// 09.04.23 GSではなくなりました。 by hosaka genya
#if 0
    // メニューリクエスト
    if( sys.trg & PAD_BUTTON_X ){
        GF_STR_PrintForceStop( *msg_index );
        *ret_wk = 1;
        return 1;
    }
#endif

    return 0;
}


//--------------------------------------------------------------------------------------------
/**
 * 看板終了待ちセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @retrn	1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBoardEndWait( VM_MACHINE * core )
{
    u16 wk_id	= VMGetU16( core );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, BoardEndWait );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 看板終了待ち
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @retval	"0 = 動作中"
 * @retval	"1 = 終了"
 *
 * @li	ANSWK = 0 : 通常終了
 * @li	ANSWK = 1 : メニューへ
 */
//--------------------------------------------------------------------------------------------
static BOOL BoardEndWait( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk			= GetEventWorkAdrs( fsys, core->reg[0] );	//注意！
    int	dir = 0xffff;

/*
	// 通常終了
//if( sys.trg & (PAD_KEY_UP|PAD_KEY_DOWN|PAD_KEY_LEFT|PAD_KEY_RIGHT|PAD_BUTTON_A|PAD_BUTTON_B) ){
	if( sys.trg & (PAD_KEY_UP|PAD_KEY_DOWN|PAD_KEY_LEFT|PAD_KEY_RIGHT|PAD_BUTTON_DECIDE|PAD_BUTTON_CANCEL) ){
     *ret_wk = 0;
		return 1;
	}
*/
    if( sys.trg & (PAD_BUTTON_DECIDE|PAD_BUTTON_CANCEL) ){
        *ret_wk = 0;
		fsys->sublcd_menu_next_flag = 0;
        return 1;
    }

    // 十字キーのリクエスト処理
    if( sys.trg & PAD_KEY_UP ){
        dir = DIR_UP;
    }else if( sys.trg & PAD_KEY_DOWN ){
        dir = DIR_DOWN;
    }else if( sys.trg & PAD_KEY_LEFT ){
        dir = DIR_LEFT;
    }else if( sys.trg & PAD_KEY_RIGHT ){
        dir = DIR_RIGHT;
    }
    if( dir != 0xffff ){
        Player_DirSet( core->fsys->player, dir );
        *ret_wk = 0;
		fsys->sublcd_menu_next_flag = 0;
        return 1;
    }

	// 09.04.23 GSではなくなりました。 by hosaka genya
#if 0
    // メニューリクエスト
    if( sys.trg & PAD_BUTTON_X ){
        *ret_wk = 1;
		fsys->sublcd_menu_next_flag = 0;
        return 1;
    }
#endif

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * メニューリクエスト
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	0
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdMenuReq( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    SetEvScriptNextFunc( fsys );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 「はい・いいえ」処理
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdYesNoWin( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    BMPMENU_WORK** mw	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_MENUWORK );
    u16 wk_id			= VMGetU16( core );

    MenuWinGraphicSet(
        fsys->bgl, FLD_MBGFRM_FONT, MENU_WIN_CGX_NUM, MENU_WIN_PAL, 0, HEAPID_FIELD );

    *mw = BmpYesNoSelectInit(
        fsys->bgl, &YesNoBmpDat, MENU_WIN_CGX_NUM, MENU_WIN_PAL, HEAPID_FIELD );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, EvYesNoSelect );

    return 1;
}

static BOOL EvYesNoSelect(VM_MACHINE * core)
{
    u32	ret;
    FIELDSYS_WORK* fsys = core->fsys;
    BMPMENU_WORK** mw	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_MENUWORK );
    u16* ret_wk			= GetEventWorkAdrs( fsys, core->reg[0] );	//注意！

    ret  = BmpYesNoSelectMain( *mw, HEAPID_FIELD );

    if( ret == BMPMENU_NULL ){ return 0; }

    if( ret == 0 ){
        *ret_wk = 0;
    }else{
        *ret_wk = 1;
    }
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	待機アイコン表示
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	0
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTimeWaitIconAdd(VM_MACHINE * core)
{
    void **buf;
    GF_BGL_BMPWIN* pMsgWinDat = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_MSGWINDAT );
    buf = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WAITICON);
    *buf = TimeWaitIconAdd(pMsgWinDat, TALK_WIN_CGX_NUM);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	待機アイコン消去
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	0
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTimeWaitIconDel(VM_MACHINE * core)
{
    void **buf;
    buf = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WAITICON);
    TimeWaitIconDel(*buf);
    return 0;
}


//============================================================================================
//
//	BMPメニュー関連
//
//	"BMPリスト"関数と同じ関数を使っているので注意！
//	・リスト終了待ち関数
//
//============================================================================================

/**
 *	@brief	BMPメニューInitコア
 *
 *	BMPMENUもBMPLISTもBMPLISTタッチバージョンもInit処理は共通
 */
static void EvCmdBmpMenuInitCore( VM_MACHINE * core , EV_WIN_WORK** ev_win,MSGDATA_MANAGER* msgman )
{
    FIELDSYS_WORK* fsys	 = core->fsys;
    WORDSET** wordset	 = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );
    u8 x				 = VMGetU8(core);
    u8 y				 = VMGetU8(core);
    u8 cursor			 = VMGetU8(core);
    u8 cancel			 = VMGetU8(core);
    u16 wk_id			 = VMGetU16( core );

    //初期化
    *ev_win	= CmdEvBmpList_Init( fsys, x, y, cursor, cancel,
                                 GetEventWorkAdrs(fsys,wk_id), *wordset,
                                 GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_MSGWINDAT),
                                 msgman);
    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;
}

//--------------------------------------------------------------
/**
 * @brief	BMPメニュー	初期化
 *
 * @param	none
 *
 * @return	1
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpMenuInit( VM_MACHINE * core )
{
	EvCmdBmpMenuInitCore( core , GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_EVWIN ), NULL );
#if 0
    FIELDSYS_WORK* fsys	= core->fsys;
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );
    WORDSET** wordset	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );
    u8 x				= VMGetU8(core);
    u8 y				= VMGetU8(core);
    u8 cursor			= VMGetU8(core);
    u8 cancel			= VMGetU8(core);
    u16 wk_id			= VMGetU16( core );

    //初期化
    *ev_win	= CmdEvBmpMenu_Init(fsys, x, y, cursor, cancel,
                                GetEventWorkAdrs(fsys,wk_id), *wordset,
                                GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_MSGWINDAT),
                                NULL );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;
#endif
    return 1;
}

//--------------------------------------------------------------
/**
 * @brief	BMPメニュー	初期化(読み込んでいるgmmファイルを使用する)
 *
 * @param	none
 *
 * @return	1
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpMenuInitEx( VM_MACHINE * core )
{
	EvCmdBmpMenuInitCore( core , GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_EVWIN ), core->msgman );

#if 0
    FIELDSYS_WORK* fsys	= core->fsys;
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );
    WORDSET** wordset	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );
    u8 x				= VMGetU8(core);
    u8 y				= VMGetU8(core);
    u8 cursor			= VMGetU8(core);
    u8 cancel			= VMGetU8(core);
    u16 wk_id			= VMGetU16( core );

    //初期化
    *ev_win	= CmdEvBmpMenu_Init(fsys, x, y, cursor, cancel,
                                GetEventWorkAdrs(fsys,wk_id), *wordset,
                                GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_MSGWINDAT),
                                core->msgman );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;
#endif
    return 1;
}

//--------------------------------------------------------------
/**
 * @brief	BMPメニュー	リスト作成
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpMenuMakeList( VM_MACHINE * core )
{
    u8 msg_id, param;
    FIELDSYS_WORK* fsys	= core->fsys;
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );	//EV_WIN_WORK取得

    msg_id	= VMGetU8(core);
    param	= VMGetU8(core);

    CmdEvBmpMenu_MakeList( *ev_win, msg_id, param );
    return 0;
}

//--------------------------------------------------------------
/**
 * @brief	BMPメニュー	リスト作成(u16バージョン)
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpMenuMakeList16( VM_MACHINE * core )
{
    u16 msg_id,param;
    FIELDSYS_WORK* fsys	= core->fsys;
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );	//EV_WIN_WORK取得

    msg_id	= VMGetWorkValue(core);
    param	= VMGetWorkValue(core);

    CmdEvBmpMenu_MakeList( *ev_win, msg_id, param );
    return 0;
}

//--------------------------------------------------------------
/**
 * @brief	BMPメニュー	開始
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpMenuStart( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys	= core->fsys;
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );	//EV_WIN_WORK取得

    CmdEvBmpMenu_Start( *ev_win );

    VM_SetWait( core, EvSelWinWait );
    return 1;
}

//ウェイト関数
static BOOL EvSelWinWait(VM_MACHINE * core)
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk = GetEventWorkAdrs( fsys, core->reg[0] );	//注意！

    if( *ret_wk == EV_WIN_NOTHING ){
        return FALSE;	//継続
    }

    return TRUE;		//終了
}


//--------------------------------------------------------------
/**
 * @brief	BMPメニュー	開始
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdUnionBmpMenuStart( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys	= core->fsys;
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );	//EV_WIN_WORK取得

    CmdEvBmpMenu_Start( *ev_win );

    VM_SetWait( core, EvSelUnionWinWait );
    return 1;
}

//ウェイト関数
static BOOL EvSelUnionWinWait(VM_MACHINE * core)
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk = GetEventWorkAdrs( fsys, core->reg[0] );	//注意！
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );	//EV_WIN_WORK取得


    if( *ret_wk == EV_WIN_NOTHING ){
        // BMPMenuList中でもキャンセルが来たら強制終了する
        if(Union_CancelRecv( fsys->union_work )){
            *ret_wk = UNION_PARENT_SELECT_CANCEL;
            EvBmpMenu_Del(*ev_win);
            return TRUE;
        }
        return FALSE;	//継続
    }

    return TRUE;		//終了
}


//============================================================================================
//
//	BMPリスト関連
//
//	"BMPメニュー"関数と同じ関数を使っているので注意！
//	・リスト終了待ち関数
//
//============================================================================================

//--------------------------------------------------------------
/**
 * @brief	BMPリスト	初期化
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpListInit( VM_MACHINE * core )
{
	EvCmdBmpMenuInitCore( core , GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_EVWIN ), NULL );
#if 0
    FIELDSYS_WORK* fsys	= core->fsys;
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );
    WORDSET** wordset	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );
    u8 x				= VMGetU8(core);
    u8 y				= VMGetU8(core);
    u8 cursor			= VMGetU8(core);
    u8 cancel			= VMGetU8(core);
    u16 wk_id			= VMGetU16( core );

    //初期化
    *ev_win	= CmdEvBmpList_Init( fsys, x, y, cursor, cancel,
                                 GetEventWorkAdrs(fsys,wk_id), *wordset,
                                 GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_MSGWINDAT),
                                 NULL );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;
#endif
    return 1;
}

//--------------------------------------------------------------
/**
 * @brief	BMPリスト	初期化(読み込んでいるgmmファイルを使用する)
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpListInitEx( VM_MACHINE * core )
{
	EvCmdBmpMenuInitCore( core , GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_EVWIN ), core->msgman );

#if 0
    FIELDSYS_WORK* fsys	= core->fsys;
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );
    WORDSET** wordset	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );
    u8 x				= VMGetU8(core);
    u8 y				= VMGetU8(core);
    u8 cursor			= VMGetU8(core);
    u8 cancel			= VMGetU8(core);
    u16 wk_id			= VMGetU16( core );

    //初期化
    *ev_win	= CmdEvBmpList_Init( fsys, x, y, cursor, cancel,
                                 GetEventWorkAdrs(fsys,wk_id), *wordset,
                                 GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_MSGWINDAT),
                                 core->msgman );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;
#endif
    return 1;
}

//--------------------------------------------------------------
/**
 * @brief	BMPリスト	リスト作成
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpListMakeList( VM_MACHINE * core )
{
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_EVWIN );
    u8 msg_id			= VMGetWorkValue(core);
    u8 talk_msg_id		= VMGetWorkValue(core);
    u8 param			= VMGetWorkValue(core);

    CmdEvBmpList_MakeList( *ev_win, msg_id, talk_msg_id, param );
    return 0;
}

//--------------------------------------------------------------
/**
 * @brief	BMPリスト	開始
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpListStart( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys	= core->fsys;
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );	//EV_WIN_WORK取得

    CmdEvBmpList_Start( *ev_win );

    VM_SetWait( core, EvSelWinWait );
    return 1;
}

//--------------------------------------------------------------
/**
 * @brief	BMPリスト	開始(横幅指定)
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpListStartWidth( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys	= core->fsys;
	EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );	//EV_WIN_WORK取得
	u16 width			= VMGetWorkValue(core);

	CmdEvBmpList_StartWidth( *ev_win, width );

	VM_SetWait( core, EvSelWinWait );
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	BMPリスト	開始(lp,cp指定)
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpListStartLpCp( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys	= core->fsys;
	EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );	//EV_WIN_WORK取得
	u16* wk				= VMGetWork(core);
	u16* wk2			= VMGetWork(core);

	CmdEvBmpList_StartLpCp( *ev_win, wk, wk2 );

	VM_SetWait( core, EvSelWinWait );
	return 1;
}


//============================================================================================
//
//	BMPメニュー縦横関連
//
//	"BMPリスト"関数と同じ関数を使っているので注意！
//	・リスト終了待ち関数
//
//============================================================================================

//--------------------------------------------------------------
/**
 * @brief	BMPメニュー縦横	開始
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
static BOOL EvCmdBmpMenuHVStart( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys	= core->fsys;
    EV_WIN_WORK** ev_win= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_EVWIN );	//EV_WIN_WORK取得
    u8 x_max			= VMGetU8(core);

    CmdEvBmpMenuHV_Start( *ev_win, x_max );

    VM_SetWait( core, EvSelWinWait );
    return 1;
}


//============================================================================================
//
//	OBJアニメーション関連
//
//============================================================================================
static BOOL EvObjAnimeWait(VM_MACHINE * core);
static void EvAnmSetTCB( FIELDSYS_WORK* fsys, TCB_PTR anm_tcb, FIELD_OBJ_ACMD_LIST * list );
static void EvAnmMainTCB( TCB_PTR tcb, void* wk );

//アニメーション終了監視ワーク
typedef struct{
    TCB_PTR	tcb;					//TCB
    TCB_PTR	anm_tcb;				//アニメーションTCB
    FIELD_OBJ_ACMD_LIST * list;
    FIELDSYS_WORK* fsys;			//
}EV_ANM_WORK;

//--------------------------------------------------------------------------------------------
/**
 * アニメーション
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjAnime( VM_MACHINE * core )
{
    VM_CODE* p;
    TCB_PTR anm_tcb;
    u8* num;
    FIELD_OBJ_PTR* dummy;
    FIELD_OBJ_PTR fldobj;		//対象のフィールドOBJのポインタ
    u16 obj_id	= VMGetWorkValue(core);
    u32 pos		= (s32)VMGetU32(core);

    fldobj = FieldObjPtrGetByObjId( core->fsys, obj_id );

    //エラーチェック
    if( fldobj == NULL ){
		OS_Printf( "obj_id = %d ", obj_id );
        OS_Printf( "対象のフィールドOBJのポインタ取得失敗！\n" );
		//スクリプト不具合対処のため連れ歩きポケモンは見逃し、
		//連れ歩きポケモン以外の場合はASSERTで停止
		GF_ASSERT( obj_id == FLDOBJ_ID_POKE_PAIR );
		return 0;				//08.06.12 プラチナで追加
    }

    //金銀で追加連れ歩きＯＢＪの場合は、アニメ開始初期化処理を行う
    if (obj_id == FLDOBJ_ID_POKE_PAIR){
        FieldOBJ_PairPokeInitStartAnm( fldobj );
    }

    //アニメーションコマンドリストセット
    p = (VM_CODE*)(core->PC+pos);
    anm_tcb = FieldOBJ_AcmdListSet( fldobj, (FIELD_OBJ_ACMD_LIST*)p );

    //アニメーションの数を足す
    num = GetEvScriptWorkMemberAdrs( core->fsys,ID_EVSCR_ANMCOUNT );
    (*num)++;

    //TCBセット
    EvAnmSetTCB( core->fsys, anm_tcb, NULL );

    return 0;
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjAnimePos(VM_MACHINE * core)
{
    VM_CODE* p;
    TCB_PTR anm_tcb;
    u8* num;
    FIELD_OBJ_PTR* dummy;
    FIELD_OBJ_PTR fldobj;		//対象のフィールドOBJのポインタ
    u16 obj_id	= VMGetWorkValue(core);
    u16 tx = VMGetWorkValue(core);
    u16 tz = VMGetWorkValue(core);
    u16 nx, nz;
    FIELD_OBJ_ACMD_LIST * list;
    int count;

    fldobj = FieldObjPtrGetByObjId( core->fsys, obj_id );

    //エラーチェック
    if( fldobj == NULL ){
        GF_ASSERT( (0) && "対象のフィールドOBJのポインタ取得失敗！" );
    }
    list = sys_AllocMemory(HEAPID_FIELD, sizeof(FIELD_OBJ_ACMD_LIST) * 64);

    nx = FieldOBJ_NowPosGX_Get( fldobj );
    nz = FieldOBJ_NowPosGZ_Get( fldobj );
    count = 0;
    if (nx < tx) {
        list[count].code = AC_WALK_R_8F;
        list[count].num = tx - nx;
        count ++;
    } else if (nx > tx) {
        list[count].code = AC_WALK_L_8F;
        list[count].num = nx - tx;
        count ++;
    }
    if (nz < tz) {
        list[count].code = AC_WALK_U_8F;
        list[count].num = tz - nz;
        count ++;
    } else if (nz > tz) {
        list[count].code = AC_WALK_D_8F;
        list[count].num = nz - tz;
        count ++;
    }
    list[count].code = ACMD_END;
    list[count].num = 0;

    //アニメーションコマンドリストセット
    anm_tcb = FieldOBJ_AcmdListSet( fldobj, list );

    //アニメーションの数を足す
    num = GetEvScriptWorkMemberAdrs( core->fsys,ID_EVSCR_ANMCOUNT );
    (*num)++;

    //TCBセット
    EvAnmSetTCB( core->fsys, anm_tcb, list );

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * FIELD_OBJ_PTRを取得
 *
 * @param	fsys	FIELDSYS_WORK型のポインタ
 * @param	obj_id	OBJID
 *
 * @return	"FIELD_OBJ_PTR"
 */
//--------------------------------------------------------------------------------------------
static FIELD_OBJ_PTR FieldObjPtrGetByObjId( FIELDSYS_WORK* fsys, int obj_id )
{
    FIELD_OBJ_PTR* dummy;
    FIELD_OBJ_PTR fldobj;		//対象のフィールドOBJのポインタ

    //連れ歩きOBJ判別IDが渡された時
    if( obj_id == SCR_OBJID_MV_PAIR ){
        fldobj = FieldOBJSys_MoveCodeSearch( fsys->fldobjsys, MV_PAIR );

        //透明ダミーOBJ判別IDが渡された時
    }else if( obj_id == SCR_OBJID_DUMMY ){
        dummy = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_DUMMY_OBJ );
        fldobj = *dummy;

        //対象のフィールドOBJのポインタ取得
    }else{
        fldobj	= FieldOBJSys_OBJIDSearch( fsys->fldobjsys, obj_id );
    }

    return fldobj;
}

//--------------------------------------------------------------------------------------------
/**
 * アニメーション終了待ち
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjAnimeWait( VM_MACHINE * core )
{
    VM_SetWait( core, EvObjAnimeWait );
    return 1;
}

//return 1 = 終了
static BOOL EvObjAnimeWait(VM_MACHINE * core)
{
    FIELDSYS_WORK* fsys = core->fsys;
    u8* anm_count = GetEvScriptWorkMemberAdrs(fsys,ID_EVSCR_ANMCOUNT);

	//OS_Printf( "*anm_count = %d\n", *anm_count );

    //アニメーション数をチェック
    if( *anm_count == 0 ){
        return 1;
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	アニメ終了監視TCB セット
 *
 * @param	fsys	FIELDSYS_WORK型のポインタ
 * @param	anm_tcb	TCB_PTR型
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void EvAnmSetTCB( FIELDSYS_WORK* fsys, TCB_PTR anm_tcb, FIELD_OBJ_ACMD_LIST * list )
{
    EV_ANM_WORK* wk = NULL;
    wk = sys_AllocMemory(HEAPID_FIELD, sizeof(EV_ANM_WORK));

    if( wk == NULL ){
        GF_ASSERT( (0) && "scrcmd.c メモリ確保失敗！" );
        return;
    }

    wk->fsys	= fsys;
    wk->anm_tcb	= anm_tcb;
    wk->list	= list;
    wk->tcb		= TCB_Add( EvAnmMainTCB, wk, 0 );
    return;
}

//--------------------------------------------------------------
/**
 * @brief	アニメ終了監視TCB メイン
 *
 * @param	tcb		TCB_PTR
 * @param	wk		ワークのアドレス
 *
 * @retval	none
 */
//--------------------------------------------------------------
static void EvAnmMainTCB( TCB_PTR tcb, void* wk )
{
    EV_ANM_WORK *swk;
    u8* num;

    swk = (EV_ANM_WORK *)wk;
    num = GetEvScriptWorkMemberAdrs( swk->fsys, ID_EVSCR_ANMCOUNT );

    if( FieldOBJ_AcmdListEndCheck( swk->anm_tcb ) == TRUE ){	//終了チェック

        FieldOBJ_AcmdListEnd( swk->anm_tcb );

        TCB_Delete( swk->tcb );
        if (swk->list) {
            sys_FreeMemoryEz(swk->list);
        }
        sys_FreeMemoryEz( wk );

        //アニメーション数の管理
        if( *num == 0 ){
            GF_ASSERT( (0) && "アニメーション数の管理が不正です！" );
            return;
        }

        (*num)--;
    }

    return;
}

//--------------------------------------------------------------------------------------------
/**
 * 全OBJ動作停止
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	0
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjPauseAll( VM_MACHINE * core )
{
    FIELD_OBJ_SYS_PTR fldobjsys;
    FIELDSYS_WORK* fsys = core->fsys;
    FIELD_OBJ_PTR *fldobj = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_TARGET_OBJ );
#ifdef PM_DEBUG
	{
		u8 deb_code = VMGetU8(core);
		if(deb_code  != 0xFF){
			DebugEvent_ObjPauseStart(core->fsys->event,deb_code);
		}
	}
#endif

    if (*fldobj == NULL) {
        fldobjsys = fsys->fldobjsys;
        FieldOBJSys_MovePauseAll( fldobjsys );
#if 1	//08.06.18
		//話しかけの対象がいないBGやPOSの時
		//連れ歩きOBJの移動動作中かのチェックをしていない
		//
		//連れ歩きOBJに対して、
		//スクリプトでアニメを発行すると、
		//アニメが行われず終了待ちにいかないでループしてしまう

		{
			FIELD_OBJ_PTR player_pair = PairPoke_GetFldObjPtr(fsys);
			//連れ歩きがいて、移動動作中なら
			if( PairPoke_IsPairPoke(fsys) && FieldOBJ_StatusBitCheck_Move(player_pair) != 0) {
				//ペアの動作ポーズ解除
				FieldOBJ_MovePauseClear( player_pair );

				//移動動作の終了待ちをセット
				VM_SetWait( core, EvWaitPairObj );
				return 1;
			}
		}
#endif		//金銀でも有効にしておく。
			//これにより、ポーズがかかった場合、連れ歩きがグリッド中心にいることが保障される反面、
			//連れ歩き動作終了まで、次のスクリプトが実行されないため、若干の待ち状態が発生する。
			//仕様としてこの動作を嫌う場合は、
			//グリッド中心まで移動しなくても、イベントを進行させてしまうようにするため
			//ここの#if部分を削除する。ならびに、終了待ち関数EvWaitPairObjも必要なくなる
    } else {
        EvCmdTalkObjPauseAll(core);
    }

    return 1;
}


//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
#define	PLAYER_BIT			(1<<0)
#define	PLAYER_PAIR_BIT		(1<<1)
#define	OTHER_BIT			(1<<2)
#define	OTHER_PAIR_BIT		(1<<3)

static u8 step_watch_bit;

//--------------------------------------------------------------
//--------------------------------------------------------------
static inline void InitStepWatchBit(void)
{
    step_watch_bit = 0;
}
//--------------------------------------------------------------
//--------------------------------------------------------------
static inline BOOL CheckStepWatchBit(int mask)
{
    return (step_watch_bit & mask) != 0;
}
//--------------------------------------------------------------
//--------------------------------------------------------------
static inline void SetStepWatchBit(int mask)
{
    step_watch_bit |= mask;
}
//--------------------------------------------------------------
//--------------------------------------------------------------
static inline void ResetStepWatchBit(int mask)
{
    step_watch_bit &= (0xff ^ mask);
}

//--------------------------------------------------------------
/**
 * @brief	OBJ動作終了待ち
 */
//--------------------------------------------------------------
static BOOL EvWaitTalkObj( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = core->fsys;
    FIELD_OBJ_PTR *fldobj = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_TARGET_OBJ );
    FIELD_OBJ_PTR player = Player_FieldOBJGet(fsys->player);

    //自機動作停止チェック
    if (CheckStepWatchBit(PLAYER_BIT) && FieldOBJ_AcmdEndCheck(player) == TRUE) {
        FieldOBJ_MovePause( player );
        ResetStepWatchBit(PLAYER_BIT);
		IWASAWA_PRINT("自機アニメを待った\n");
    }
    //話しかけ対象動作停止チェック
    if (CheckStepWatchBit(OTHER_BIT) && FieldOBJ_StatusBitCheck_Move(*fldobj) == 0) {
        FieldOBJ_MovePause( *fldobj );
        ResetStepWatchBit(OTHER_BIT);
		IWASAWA_PRINT("相手の移動を待った\n");
    }

    //自機の連れ歩き動作停止チェック
    if (CheckStepWatchBit(PLAYER_PAIR_BIT)) {
        FIELD_OBJ_PTR player_pair = FieldOBJSys_MoveCodeSearch( fsys->fldobjsys, MV_PAIR );
        if (FieldOBJ_StatusBitCheck_Move(player_pair) == 0) {
            FieldOBJ_MovePause(player_pair);
            ResetStepWatchBit(PLAYER_PAIR_BIT);
			IWASAWA_PRINT("自機連れ歩き動作を待った\n");
        }else{
			IWASAWA_PRINT("自機連れ歩き動作を待ったが既にOffだった\n");
		}
    }

    //話しかけ対象の連れ歩き動作停止チェック
    if (CheckStepWatchBit(OTHER_PAIR_BIT)) {
        FIELD_OBJ_PTR other_pair = FieldOBJ_MovePairSearch(*fldobj);
        if (FieldOBJ_StatusBitCheck_Move(other_pair) == 0) {
            FieldOBJ_MovePause(other_pair);
            ResetStepWatchBit(OTHER_PAIR_BIT);
			IWASAWA_PRINT("話しかけ連れ歩き動作を待った\n");
        }
    }

    if (step_watch_bit == 0) {
        return 1;
    }
    return 0;
}

//--------------------------------------------------------------
/**
 * @brief	ペアOBJ動作終了待ち
 */
//--------------------------------------------------------------
static BOOL EvWaitPairObj( VM_MACHINE * core )
{
	FIELDSYS_WORK * fsys = core->fsys;
	FIELD_OBJ_PTR player_pair = PairPoke_GetFldObjPtr(fsys);

	//自機の連れ歩き動作停止チェック
	if (FieldOBJ_StatusBitCheck_Move(player_pair) == 0) {
		FieldOBJ_MovePause(player_pair);
		return 1;							//移動動作が終了した
	}

	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @param	core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTalkObjPauseAll( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    FIELD_OBJ_PTR *fldobj = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_TARGET_OBJ );
    FIELD_OBJ_PTR player = Player_FieldOBJGet(fsys->player);
    FIELD_OBJ_PTR player_pair = FieldOBJSys_MoveCodeSearch( fsys->fldobjsys, MV_PAIR );
    FIELD_OBJ_PTR other_pair = FieldOBJ_MovePairSearch(*fldobj);
    FIELD_OBJ_SYS_PTR fldobjsys;

    fldobjsys = fsys->fldobjsys;

    InitStepWatchBit();

    FieldOBJSys_MovePauseAll( fldobjsys );

    if (FieldOBJ_AcmdEndCheck(player) == FALSE) {
        SetStepWatchBit(PLAYER_BIT);
        FieldOBJ_MovePauseClear( player );
	}

    if (FieldOBJ_StatusBitCheck_Move(*fldobj) != 0) {
        SetStepWatchBit(OTHER_BIT);
        FieldOBJ_MovePauseClear( *fldobj );
    }

    //連れ歩きポケモンはポーズ解除
    if (player_pair) {
        if( PairPoke_IsPairPoke(fsys)
            && ( !FieldOBJ_StatusBitCheck_Move(player_pair) ) ) {
			SetStepWatchBit(PLAYER_PAIR_BIT);
			FieldOBJ_MovePauseClear( player_pair );
//			IWASAWA_PRINT("連れ歩き動作待ち\n");
        }else{
			IWASAWA_PRINT("NonWait\n");
		}
    }

    if (other_pair) {
        if (FieldOBJ_StatusBitCheck_Move(other_pair) != 0) {
            SetStepWatchBit(OTHER_PAIR_BIT);
            FieldOBJ_MovePauseClear( other_pair );
        }
    }
    VM_SetWait( core, EvWaitTalkObj );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 全OBJ動作再開
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjPauseClearAll( VM_MACHINE * core )
{
    FIELD_OBJ_SYS_PTR fldobjsys;
    FIELDSYS_WORK* fsys = core->fsys;

    fldobjsys = fsys->fldobjsys;

    FieldOBJSys_MovePauseAllClear( fldobjsys );

#ifdef PM_DEBUG
	{
		u8 deb_code = VMGetU8(core);
		if(deb_code != 0xFF){
			DebugEvent_ObjPauseEnd(core->fsys->event,deb_code);
		}
	}
#endif

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * OBJ動作停止(個々)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	0
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjPause( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;		//対象のフィールドOBJのポインタ
    FIELDSYS_WORK* fsys = core->fsys;
	u16 obj_id;

	obj_id = VMGetU16(core);

    //対象のフィールドOBJのポインタ取得
    fldobj = FieldOBJSys_OBJIDSearch( fsys->fldobjsys, obj_id );
	if (fldobj != NULL) {
		//動作ポーズ ON
		FieldOBJ_MovePause( fldobj );
	} else {
		OS_Printf( "scrcmd: obj(%d) not found: can't pause\n", obj_id );
		//スクリプト不具合対処のため連れ歩きポケモンは見逃し、
		//連れ歩きポケモン以外の場合はASSERTで停止
		GF_ASSERT( obj_id == FLDOBJ_ID_POKE_PAIR );
	}

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * OBJ動作再開(個々)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	0
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjPauseClear( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;		//対象のフィールドOBJのポインタ
    FIELDSYS_WORK* fsys = core->fsys;
	u16 obj_id;

	obj_id = VMGetU16(core);

    //対象のフィールドOBJのポインタ取得
    fldobj = FieldOBJSys_OBJIDSearch( fsys->fldobjsys, obj_id );
	if (fldobj != NULL) {
		//動作ポーズ OFF
		FieldOBJ_MovePauseClear( fldobj );
	} else {
		OS_Printf( "scrcmd: obj(%d) not found: can't pause clear\n", obj_id );
		//スクリプト不具合対処のため連れ歩きポケモンは見逃し、
		//連れ歩きポケモン以外の場合はASSERTで停止
		GF_ASSERT( obj_id == FLDOBJ_ID_POKE_PAIR );
	}

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * OBJ出す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjAdd( VM_MACHINE * core )
{
    FIELD_OBJ_PTR ret;
    FIELDSYS_WORK* fsys = core->fsys;
    u16 id				= VMGetWorkValue(core);

    ret= FieldOBJ_AddHEvent( fsys->fldobjsys, id, EventData_GetNpcCount(fsys),
                             fsys->location->zone_id, EventData_GetNpcData(fsys) );

    if( ret == NULL ){
        GF_ASSERT( (0) && "指定したIDに該当するデータがありませんでした！" );
    }

    return 0;
}


//--------------------------------------------------------------------------------------------
/**
 * OBJ消す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjDel( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;		//対象のフィールドOBJのポインタ
    FIELDSYS_WORK* fsys = core->fsys;

    //対象のフィールドOBJのポインタ取得
    fldobj	= FieldOBJSys_OBJIDSearch( fsys->fldobjsys, VMGetWorkValue(core) );

	if( fldobj == NULL ){
		GF_ASSERT( (0) && "対象のフィールドOBJのポインタ取得失敗！" );
	}else{
		FieldOBJ_DeleteEvent( fldobj );
	}

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 透明ダミーOBJを追加(カメラ設定も切り替え)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdVanishDummyObjAdd( VM_MACHINE * core )
{
    u16 x	= VMGetWorkValue( core );
    u16 z	= VMGetWorkValue( core );
    FIELD_OBJ_PTR* fldobj = GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_DUMMY_OBJ);//ダミーOBJ

#if 0
    //汎用的に使う時
    u16 dir = VMGetWorkValue( core );
    u16 obj = VMGetWorkValue( core );	//OBJコード(HERO等)
    u16 move= VMGetWorkValue( core );	//動作コード
    u16 zone= VMGetU16( core );			//ゾーンID
    *fldobj = FieldOBJ_AddHMake( core->fsys->fldobjsys, x, z, dir, obj, move, zone_id );
#endif

    //ダミーOBJ用固定
    *fldobj = FieldOBJ_AddHMake( core->fsys->fldobjsys, x, z, DIR_UP, NONDRAW,
                                 MV_DMY, core->fsys->location->zone_id );

    FieldOBJ_VecPosNowHeightGetSet( *fldobj );			//高さ即反映
    FieldOBJ_StatusBitSet_Vanish( *fldobj, TRUE );		//非表示
    FieldOBJ_StatusBitSet_FellowHit( *fldobj, FALSE );	//ヒットなし
    //FieldOBJ_NotZoneDeleteSet( *fldobj, TRUE );		//ゾーン切り替え時の削除禁止

#if 1
    //カメラ設定切り替え(透明ダミーへ)
    {
        const VecFx32* inTarget;

        inTarget = FieldOBJ_VecPosPtrGet( *fldobj );
        DivMapBindTarget( inTarget, core->fsys->map_cont_dat );	//地形バインド
        GFC_BindCameraTarget( inTarget, core->fsys->camera_ptr );
    }
#endif

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 透明ダミーOBJを削除(カメラ設定も切り替え)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdVanishDummyObjDel( VM_MACHINE * core )
{
    FIELD_OBJ_PTR* fldobj = GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_DUMMY_OBJ);	//ダミーOBJ
    FieldOBJ_Delete( *fldobj );

#if 1
    //カメラ設定切り替え(主人公へ)
    {
        FIELD_OBJ_PTR fldobj_player;
        const VecFx32* inTarget;

        fldobj_player = FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, FLDOBJ_ID_PLAYER );
        inTarget = FieldOBJ_VecPosPtrGet( fldobj_player );
        DivMapBindTarget( inTarget, core->fsys->map_cont_dat );	//地形バインド
        GFC_BindCameraTarget( inTarget, core->fsys->camera_ptr );
    }
#endif

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 透明ダミーOBJを追加
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdVanishDummyObjAdd2( VM_MACHINE * core )
{
	u16 x	= VMGetWorkValue( core );
	u16 z	= VMGetWorkValue( core );
	FIELD_OBJ_PTR* fldobj = GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_DUMMY_OBJ);//ダミーOBJ

	//ダミーOBJ用固定
	*fldobj = FieldOBJ_AddHMake( core->fsys->fldobjsys, x, z, DIR_UP, NONDRAW,
								MV_DMY, core->fsys->location->zone_id );

	FieldOBJ_VecPosNowHeightGetSet( *fldobj );			//高さ即反映
	FieldOBJ_StatusBitSet_Vanish( *fldobj, TRUE );		//非表示
	FieldOBJ_StatusBitSet_FellowHit( *fldobj, FALSE );	//ヒットなし
	//FieldOBJ_NotZoneDeleteSet( *fldobj, TRUE );		//ゾーン切り替え時の削除禁止

	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 透明ダミーOBJを削除
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdVanishDummyObjDel2( VM_MACHINE * core )
{
	FIELD_OBJ_PTR* fldobj = GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_DUMMY_OBJ);	//ダミーOBJ
	FieldOBJ_Delete( *fldobj );
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 話しかけたOBJ自機方向への振り向き
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjTurn( VM_MACHINE * core )
{
    int dir,old_dir;
    FIELD_OBJ_PTR* fldobj;
    FIELDSYS_WORK* fsys = core->fsys;

    {
        FIELDSYS_WORK *fsys;
        PLAYER_STATE_PTR player;

        fsys = core->fsys;
        player = fsys->player;

        dir = Player_DirGet( player );
    }

    dir = FieldOBJTool_DirFlip( dir );

    fldobj = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_TARGET_OBJ );
    if( *fldobj == NULL ){
        return 0;
    }

    old_dir = FieldOBJ_DirDispGet( *fldobj );

    //FieldOBJ_DirDispCheckSet( *fldobj, dir );
    FieldOBJ_DirDispDrawSet( *fldobj, dir );

    //金銀で追加。大きな連れ歩きポケモン用処理。振り向き後の後ろグリッドに草エフェクトを追加（追加が必要な場合のみ）
    if ( (FieldOBJ_OBJIDGet(*fldobj)==FLDOBJ_ID_POKE_PAIR) && PairPoke_GetInfo_BigSize(*fldobj) && (old_dir!=dir) ){
#if GS_AFTERMASTER_GF1063_20091013_FIX
      int x,z;
      u16 attr;
      //検索座標を取得
      PairPoke_GetBackPos(*fldobj, &x, &z);
      attr = GetAttributeLSB( fsys, x, z );
      if ( (dir == DIR_LEFT)||(dir == DIR_RIGHT) ){
        if( MATR_IsGrass(attr) == TRUE ){
          FE_FldOBJGrass_AddXZ( *fldobj, FALSE, x, z, TRUE );
        }else if(  MATR_IsLongGrass(attr) == TRUE ){
          FE_FldOBJLGrass_AddXZ( *fldobj, FALSE, x, z, TRUE );
        }
      }
      //影復帰
      if( MATR_IsGrass(attr) == FALSE &&
          MATR_IsLongGrass(attr) == FALSE &&
          FieldOBJ_MapAttrKindCheck_Water(*fldobj,attr) == FALSE &&
          MATR_IsPoolCheck(attr) == FALSE &&
          MATR_IsShoal(attr) == FALSE &&
          FieldOBJ_MapAttrKindCheck_Snow(*fldobj,attr) == FALSE &&
          MATR_IsSwamp(attr) == FALSE &&
          MATR_IsMirrorReflect(attr) == FALSE ){
          FieldOBJ_StatusBit_OFF( *fldobj, FLDOBJ_STA_BIT_SHADOW_VANISH );
        }
#else
		if ( (dir == DIR_LEFT)||(dir == DIR_RIGHT) ){
			int x,z;
        	u16 attr;
        	//検索座標を取得
        	PairPoke_GetBackPos(*fldobj, &x, &z);
        	attr = GetAttributeLSB( fsys, x, z );
        	if( MATR_IsGrass(attr) == TRUE ){
            	FE_FldOBJGrass_AddXZ( *fldobj, FALSE, x, z, TRUE );
        	}else if(  MATR_IsLongGrass(attr) == TRUE ){
				FE_FldOBJLGrass_AddXZ( *fldobj, FALSE, x, z, TRUE );
			}
		}
#endif  //GS_AFTERMASTER_GF1063_20091013_FIX
    }
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 主人公の位置情報取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPlayerPosGet( VM_MACHINE * core )
{
    u16 *x, *z;
    FIELDSYS_WORK* fsys = core->fsys;

    x = VMGetWork( core );
    z = VMGetWork( core );

    //int x,z;
    //x = Player_NowGPosXGet( fsys->player );
    //z = Player_NowGPosZGet( fsys->player );

    *x = Player_NowGPosXGet( fsys->player );
    *z = Player_NowGPosZGet( fsys->player );

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * OBJの位置情報取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjPosGet( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;
    u16 *x, *z;
	u16 obj_id;
    FIELDSYS_WORK* fsys = core->fsys;

	obj_id = VMGetWorkValue(core);
    fldobj = FieldOBJSys_OBJIDSearch( fsys->fldobjsys, obj_id);

    x = VMGetWork( core );
    z = VMGetWork( core );

	if (fldobj != NULL) {
		*x = FieldOBJ_NowPosGX_Get( fldobj );
		*z = FieldOBJ_NowPosGZ_Get( fldobj );
		OS_Printf( "x = %d\n", *x );
		OS_Printf( "z = %d\n", *z );
	} else {
		*x = 0xff;
		*z = 0xff;
		OS_Printf( "scrcmd: obj(%d) not found: can't get position\n", obj_id );
		//スクリプト不具合対処のため連れ歩きポケモンは見逃し、
		//連れ歩きポケモン以外の場合はASSERTで停止
		GF_ASSERT( obj_id == FLDOBJ_ID_POKE_PAIR );
	}

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * プレイヤーの方向取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPlayerDirGet( VM_MACHINE * core )
{
    u16 *dir;

    dir = VMGetWork( core );
    *dir = Player_DirGet(core->fsys->player);

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 主人公の位置に任意のオフセット値を指定する
 * カメラ位置を同時にずらすので注意！
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPlayerPosOffsetSet( VM_MACHINE * core )
{
    u16	ofsx,ofsy,ofsz;
    VecFx32	vec;
    FIELDSYS_WORK* fsys = core->fsys;

    ofsx = VMGetWorkValue(core);
    ofsy = VMGetWorkValue(core);
    ofsz = VMGetWorkValue(core);

    vec.x = FX32_CONST(ofsx);
    vec.y = FX32_CONST(ofsy);
    vec.z = FX32_CONST(ofsz);

    FieldOBJ_VecDrawOffsOutSideSet(	Player_FieldOBJGet(core->fsys->player),&vec );
    GFC_ShiftCamera(&vec,core->fsys->camera_ptr);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ゾーン切り替え時の削除禁止(TRUE=禁止、FALSE=禁止しない)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdNotZoneDelSet( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;
    u8 flag;

    fldobj	= FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, VMGetWorkValue(core) );
    flag	= VMGetU8( core );

    FieldOBJ_NotZoneDeleteSet( fldobj, flag );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 動作コード変更
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdMoveCodeChange( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;
    u16 code;

    fldobj	= FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, VMGetWorkValue(core) );
    code	= VMGetU16( core );

	//ＮＵＬＬチェックを追加　090618 add
	if (fldobj != NULL){
		FieldOBJ_MoveCodeChange( fldobj, code );
	}
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 動作コード取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdMoveCodeGet( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = 0;

    fldobj	= FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, VMGetWorkValue(core) );
    if( fldobj != NULL ){
        *ret_wk = FieldOBJ_MoveCodeGet( fldobj );
    }

    return 0;
}
//--------------------------------------------------------------------------------------------
/**
 * アンノーンフォルムナンバーを取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnknownFormGet(VM_MACHINE * core)
{
    POKEMON_PARAM * poke;
    u16 pos		= VMGetWorkValue( core );
    u16* ret_wk	= VMGetWork( core );

    //ポケモンへのポインタ取得
    poke = PokeParty_GetMemberPointer( SaveData_GetTemotiPokemon(core->fsys->savedata), pos );

    //0-25:A-Z 26:! 27:?(poke_tool.h)
    *ret_wk = PokeParaUnknownFormGet( poke );

    //OS_Printf( "form_id = %d\n", *ret_wk );
    return 0;
}


//============================================================================================
//
//	ポケモン関連
//
//============================================================================================
//--------------------------------------------------------------------------------------------
/**
 * @brief	ポケモン選択画面呼び出し（選択のみ）
 *
 * @param	core	仮想マシン制御構造体へのポインタ
 *
 * @return	1		スクリプトからメイン制御に戻る
 *
 * @li EvCmdPokeListGetResultで、選択した位置を取得して、ワーク開放が必要
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPokeListSetProc(VM_MACHINE * core)
{
    void ** buf;
    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    *buf = FieldPokeListEvent_SetProc(HEAPID_EVENT, core->fsys);

    VM_SetWait( core, EvCmdWaitSubProcEnd );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ポケモン選択画面呼び出し（ゲーム内交換用）
 *
 * @param	core	仮想マシン制御構造体へのポインタ
 *
 * @return	1		スクリプトからメイン制御に戻る
 *
 * @li EvCmdPokeListGetResultで、選択した位置を取得して、ワーク開放が必要
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdNpcTradePokeListSetProc(VM_MACHINE * core)
{
    void ** buf;
    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    *buf = FieldPokeListEventNpcTrade_SetProc(HEAPID_EVENT, core->fsys);

    VM_SetWait( core, EvCmdWaitSubProcEnd );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ユニオン ポケモン選択画面呼び出し
 *
 * @param	core	仮想マシン制御構造体へのポインタ
 * @return	1		スクリプトからメイン制御に戻る
 *
 * @li EvCmdPokeListGetResultで、選択した位置を取得して、ワーク開放が必要
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionPokeListSetProc(VM_MACHINE * core)
{
    void ** buf;
    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    //*buf = UnionPokeListEvent_SetProc(HEAPID_EVENT, core->fsys);
    //VM_SetWait( core, EvCmdWaitSubProcEnd );
    *buf = EventCmd_PokeListSelect(core->fsys->event, HEAPID_EVENT);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ポケモン選択画面呼び出し
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	1		スクリプトからメイン制御に戻る
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPokeListGetResult(VM_MACHINE * core)
{
    void ** buf;
    u16 * ret_wk;

    ret_wk = VMGetWork(core);
    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

    GF_ASSERT(*buf != 0);

    *ret_wk = FieldPokeListEvent_GetSelect(*buf);
    if (*ret_wk == PL_SEL_POS_EXIT) {
        *ret_wk = 0xff;
    }

    sys_FreeMemoryEz(*buf);
    *buf = NULL;

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	バトルステージポケモン選択画面呼び出し
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	1		スクリプトからメイン制御に戻る
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBattleStagePokeListGetResult(VM_MACHINE * core)
{
	u16 num;
	int sel;
	void** buf;
	u16* ret_wk;
	u16* ret2_wk;
	PLIST_DATA* pld;

	ret_wk	= VMGetWork(core);
	ret2_wk	= VMGetWork(core);

	buf		= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
	pld		= *buf;

	GF_ASSERT( *buf != 0 );

	sel = FieldPokeListEvent_GetSelect( *buf );

	if( sel == PL_SEL_POS_EXIT ){

		*ret_wk = 0xff;

	}else if( sel == PL_SEL_POS_ENTER ){

		OS_Printf( "バトルステージ　ポケモン選択結果\n" );
		//OS_Printf( "pld = %d\n", pld );

		//現在選ばれているポケモンを保存
		//OS_Printf( "pld->in_num[0] = %d\n", pld->in_num[0] );
		num = pld->in_num[0];
		//OS_Printf( "num = %d\n", num );
		*ret_wk = num;
		//OS_Printf( "*ret_wk = %d\n", *ret_wk );
		*ret_wk -= 1;											//0-5に変更
		OS_Printf( "*ret_wk = %d\n", *ret_wk );

		//OS_Printf( "pld->in_num[1] = %d\n", pld->in_num[1] );
		num = pld->in_num[1];
		//OS_Printf( "pld = %d\n", pld );
		//OS_Printf( "num = %d\n", num );
		*ret2_wk = num;
		//OS_Printf( "pld = %d\n", pld );
		//OS_Printf( "*ret2_wk = %d\n", *ret2_wk );

		if( *ret2_wk > 0 ){
			*ret2_wk -= 1;										//0-5に変更
		}
		OS_Printf( "*ret2_wk = %d\n", *ret2_wk );
	}

	sys_FreeMemoryEz(*buf);
	*buf = NULL;

	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	バトルキャッスルポケモン選択画面呼び出し
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	1		スクリプトからメイン制御に戻る
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBattleCastlePokeListGetResult(VM_MACHINE * core)
{
	u16 num;
	int sel;
	void** buf;
	u16* ret_wk;
	u16* ret2_wk;
	u16* ret3_wk;
	PLIST_DATA* pld;

	ret_wk	= VMGetWork(core);
	ret2_wk	= VMGetWork(core);
	ret3_wk	= VMGetWork(core);

	buf		= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
	pld		= *buf;

	GF_ASSERT( *buf != 0 );

	sel = FieldPokeListEvent_GetSelect( *buf );

	if( sel == PL_SEL_POS_EXIT ){

		*ret_wk = 0xff;

	}else if( sel == PL_SEL_POS_ENTER ){

		OS_Printf( "バトルキャッスル　ポケモン選択結果\n" );

		//現在選ばれているポケモンを保存
		*ret_wk = pld->in_num[0];
		*ret_wk -= 1;											//0-5に変更
		OS_Printf( "*ret_wk = %d\n", *ret_wk );

		*ret2_wk = pld->in_num[1];
		*ret2_wk -= 1;											//0-5に変更
		OS_Printf( "*ret2_wk = %d\n", *ret2_wk );

		*ret3_wk = pld->in_num[2];
		if( *ret3_wk > 0 ){
			*ret3_wk -= 1;										//0-5に変更
		}
		OS_Printf( "*ret3_wk = %d\n", *ret3_wk );
	}

	sys_FreeMemoryEz(*buf);
	*buf = NULL;

	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	バトルルーレットポケモン選択画面呼び出し
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	1		スクリプトからメイン制御に戻る
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBattleRoulettePokeListGetResult(VM_MACHINE * core)
{
	u16 num;
	int sel;
	void** buf;
	u16* ret_wk;
	u16* ret2_wk;
	u16* ret3_wk;
	PLIST_DATA* pld;

	ret_wk	= VMGetWork(core);
	ret2_wk	= VMGetWork(core);
	ret3_wk	= VMGetWork(core);

	buf		= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
	pld		= *buf;

	GF_ASSERT( *buf != 0 );

	sel = FieldPokeListEvent_GetSelect( *buf );

	if( sel == PL_SEL_POS_EXIT ){

		*ret_wk = 0xff;

	}else if( sel == PL_SEL_POS_ENTER ){

		OS_Printf( "バトルルーレット　ポケモン選択結果\n" );

		//現在選ばれているポケモンを保存
		*ret_wk = pld->in_num[0];
		*ret_wk -= 1;											//0-5に変更
		OS_Printf( "*ret_wk = %d\n", *ret_wk );

		*ret2_wk = pld->in_num[1];
		*ret2_wk -= 1;											//0-5に変更
		OS_Printf( "*ret2_wk = %d\n", *ret2_wk );

		*ret3_wk = pld->in_num[2];
		if( *ret3_wk > 0 ){
			*ret3_wk -= 1;										//0-5に変更
		}
		OS_Printf( "*ret3_wk = %d\n", *ret3_wk );
	}

	sys_FreeMemoryEz(*buf);
	*buf = NULL;

	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ポケモンステータス画面呼び出し後の結果取得とワーク解放
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	1		スクリプトからメイン制御に戻る
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPokeStatusGetResult(VM_MACHINE * core)
{
    void ** buf;
	u8	mode = VMGetU8(core);
    u16 * ret_wk = VMGetWork(core);

    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

    GF_ASSERT(*buf != 0);

	if(mode == SCR_PSTMODE_WAZAOSHIE){
		*ret_wk = FieldWazaListEvent_GetSelect(*buf);
	}else{
	    *ret_wk = FieldPokeStatusEvent_GetPos(*buf);
	}

    sys_FreeMemoryEz(*buf);
    *buf = NULL;

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ポケモンステータス画面呼び出し
 *
 * @param	core	仮想マシン制御構造体へのポインタ
 *
 * @return	1		スクリプトからメイン制御に戻る
 *
 * @li EvCmdPokeStatusGetResultで、選択した位置を取得して、ワーク開放が必要
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPokeStatusSetProc(VM_MACHINE * core)
{
	void** buf	= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
	u8	mode	= VMGetU8(core);
	u16 pos		= VMGetWorkValue(core);
	u16 waza	= VMGetWorkValue(core);

	if(mode == SCR_PSTMODE_WAZAOSHIE){
		*buf = FieldWazaListEvent_SetProc( HEAPID_EVENT, core->fsys, pos, waza );
	}else{
		*buf = PokeStatusEvent_SetProc( HEAPID_EVENT, core->fsys, pos );
	}

	VM_SetWait( core, EvCmdWaitSubProcEnd );
	return 1;
}

//============================================================================================
//
//	ポケサーチャー関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 渡された電話番号を持つトレーナーが再戦可能かチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdRevengeTrainerSearch(VM_MACHINE * core)
{
	PMTEL_BOOK_MAN* man;
    u16	tel_number			= VMGetWorkValue(core);
    u16* ret_wk				= VMGetWork( core );

	man = PMTelBookData_AllocAll(HEAPID_EVENT);

	Overlay_Load( FS_OVERLAY_ID( field_revenge ), OVERLAY_LOAD_NOT_SYNCHRONIZE );
	*ret_wk = FldPMTel_RevengeTrainerSearch(tel_number,
				core->fsys->savedata, man,EVTIME_GetGSTimeZone( core->fsys ) );
	Overlay_UnloadID( FS_OVERLAY_ID( field_revenge ) );

	PMTelBookData_Free(man);
    return 0;
}


//============================================================================================
//
//	天候関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 天候コードのセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetWeather( VM_MACHINE * core )
{
	u16* ret_wk	= VMGetWork( core );

	*ret_wk = Situation_GetWeatherID( SaveData_GetSituation(core->fsys->savedata) );
	return 0;
}



//============================================================================================
//
//	プログラム呼び出し関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * @brief	サブプロセス終了待ち＋ワーク解放 ※外部からの参照可能にするためstaticから変更
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	"継続=0、終了=1"
 *
 * EvCmdWaitSubProcEndとの違いは、サブプロセスが終了したときに
 * ID_EVSCR_SUBPROC_WORKに確保したワークの解放処理があること
 */
//--------------------------------------------------------------------------------------------
BOOL EvWaitSubProcAndFree(VM_MACHINE * core)
{
    void ** buf;
    FIELDSYS_WORK * fsys = core->fsys;
    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

    if( FieldEvent_Cmd_WaitSubProcEnd(fsys) ){		//サブプロセス終了待ち
        return 0;
    }
    sys_FreeMemoryEz(*buf);
    *buf = NULL;

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	サブプロセス終了待ち＋ワーク解放（ボックス用）
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	"継続=0、終了=1"
 *
 * EvCmdWaitSubProcEndとの違いは、サブプロセスが終了したときに
 * ID_EVSCR_SUBPROC_WORKに確保したワークの解放処理があること
 */
//--------------------------------------------------------------------------------------------
static BOOL EvWaitBoxProcAndFree(VM_MACHINE * core)
{
    void ** buf;
    FIELDSYS_WORK * fsys;
    BOX_PROC_PARAM * box;

    fsys = core->fsys;
    buf  = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_SUBPROC_WORK );
    box  = *buf;

    if( FieldEvent_Cmd_WaitSubProcEnd(fsys) ){		//サブプロセス終了待ち
        return 0;
    }

	//電話イベント監視
	FldPMTel_EvCheckMasakiBoxFull(fsys);

    sys_FreeMemoryEz(*buf);
    *buf = NULL;

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	サブプロセス終了待ち＋ワーク解放 ぐるぐる交換用
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	"継続=0、終了=1"
 *
 * EvCmdWaitSubProcEndとの違いは、サブプロセスが終了したときに
 * ID_EVSCR_SUBPROC_WORKに確保したワークの解放処理があること
 */
//--------------------------------------------------------------------------------------------
static BOOL EvWaitSubProcAndFree_Guru2(VM_MACHINE * core)
{
	void ** buf;
	FIELDSYS_WORK * fsys = core->fsys;
	buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

	if( EventCmd_Guru2Proc(*buf) == FALSE ){		//サブプロセス終了待ち
		return 0;
	}

	*buf = NULL;
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * サブプロセス終了待ち ※外部からの参照可能にするためstaticから変更
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"継続=0、終了=1"
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdWaitSubProcEnd( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = core->fsys;

    if( FieldEvent_Cmd_WaitSubProcEnd(fsys) ){		//サブプロセス終了待ち
        return 0;
    }

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * フィールドプロセス復帰
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSetMapProc(VM_MACHINE * core)
{
    EventCmd_StartFieldMap(core->fsys->event);
    return 1;
}
//--------------------------------------------------------------------------------------------
/**
 * フィールドマッププロセス終了待ち
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFinishMapProc(VM_MACHINE * core)
{
    EventCmd_FinishFieldMap(core->fsys->event);
    return 1;
}

//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------
/**
 *	@brief	イメージクリップ　セーブデータ有無チェック
 *
 *	@param	fsys		ｆｓｙｓ
 *	@param	con_tv		コンテスト　テレビフラグ	IMC_PREV_TV IMC_PREV_CON
 *	@param	data_idx	セーブデータ　インデックス
 *
 *	@retval	TRUE	データある
 *	@retval	FALSE	データなし
 */
//-----------------------------------------------------------------------------
static BOOL ImageClip_SaveDataCheck( FIELDSYS_WORK * fsys, int con_tv, int data_idx )
{
    IMC_SAVEDATA* iw = SaveData_GetImcSaveData( fsys->savedata );

    // セーブ済みチェック
    if( con_tv == IMC_PREV_TV ){
        if( ImcSaveData_CheckTelevisionSaveData( iw, data_idx ) == FALSE ){
            return FALSE;
        }
    }else{
        if( ImcSaveData_CheckContestSaveData( iw, data_idx ) == FALSE ){
            return FALSE;
        }
    }
    return TRUE;
}


//----------------------------------------------------------------------------
/**
 *	@brief	Viewerデータ作成
 *
 *	@param	heap		ヒープ
 *	@param	fsys		ｆｓｙｓ
 *	@param	con_tv		コンテスト　テレビフラグ	IMC_PREV_TV IMC_PREV_CON
 *	@param	data_idx	セーブデータ　インデックス
 *
 *	@return	ワーク
 */
//-----------------------------------------------------------------------------
static IMC_PROC_PREV_WORK* ImageClipViewer_DataMake( int heap, FIELDSYS_WORK * fsys, int con_tv, int data_idx )
{
    IMC_PROC_PREV_WORK* p_work;
    IMC_TELEVISION_SAVEDATA* p_tv;
    IMC_CONTEST_SAVEDATA* p_con;
    IMC_SAVEDATA* iw = SaveData_GetImcSaveData( fsys->savedata );

    // セーブデータ有無チェック
    if( ImageClip_SaveDataCheck( fsys, con_tv, data_idx ) == FALSE ){
        return  NULL;
    }

    // ワーク取得
    p_work = sys_AllocMemory( heap, sizeof(IMC_PROC_PREV_WORK) );
    memset( p_work, 0, sizeof(IMC_PROC_PREV_WORK) );

    // セーブデータ取得
    p_work->p_imc_data = iw;
    p_work->prev_type = con_tv;
    p_work->data_idx = data_idx;

    return p_work;
}


#if 0
static void ImcClip_DataDelete( IMC_PROC_WORK* imc_w )
{
    sys_FreeMemoryEz( imc_w->p_poke_para );
    sys_FreeMemoryEz( imc_w );
}
#endif

//--------------------------------------------------------------------------------------------
/**
 * ともだちコード登録イベント
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWiFiAutoReg( VM_MACHINE * core )
{
    EventSet_WifiAutoReg( core->fsys );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * P2P対戦マッチングボード呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWiFiP2PMatchEventCall( VM_MACHINE * core )
{
    EventCmd_P2PMatchProc( core->event_work );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * P2P対戦マッチングボードの戻り値を取得、確保したメモリ削除
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWiFiP2PMatchSetDel( VM_MACHINE * core )
{
    WIFIP2PMATCH_PROC_PARAM* param;
    void** buf		= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    u16* ret_wk		= VMGetWork( core );

    param = (*buf);
    *ret_wk = param->seq;
    OS_Printf( "WiFi P2P Match = %d\n", *ret_wk );

    sys_FreeMemoryEz( *buf );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 自分のNET_IDを返す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCommGetCurrentID( VM_MACHINE * core )
{
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = CommGetCurrentID();
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケモンウィンドウ表示
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * @li ID_EVSCR_PWORK使用！
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPokeWindowPut( VM_MACHINE * core )
{
    void** pwork	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );
    u16 monsno		= VMGetWorkValue(core);
    u16 sex			= VMGetWorkValue(core);

    MenuWinGraphicSet(
        core->fsys->bgl, FLD_MBGFRM_FONT, MENU_WIN_CGX_NUM, MENU_WIN_PAL, 0, HEAPID_FIELD );

    *pwork = PokeWindowPut( core->fsys->bgl, FLD_MBGFRM_FONT, 10, 5,
                            MENU_WIN_PAL, MENU_WIN_CGX_NUM, monsno, sex, HEAPID_FIELD );

    //図鑑見たフラグをセット
    Scr_ZukanSeeSet( core->fsys, monsno );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケモンウィンドウ表示(POKEMON_PARAM)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * @li ID_EVSCR_PWORK使用！
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPokeWindowPutPP( VM_MACHINE * core )
{
    POKEMON_PARAM * poke;
    void** pwork	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );
    u16 pos			= VMGetWorkValue(core);

    //ポケモンへのポインタ取得
    poke = PokeParty_GetMemberPointer( SaveData_GetTemotiPokemon(core->fsys->savedata), pos);

    MenuWinGraphicSet(
        core->fsys->bgl, FLD_MBGFRM_FONT, MENU_WIN_CGX_NUM, MENU_WIN_PAL, 0, HEAPID_FIELD );

    *pwork = PokeWindowPutPP( core->fsys->bgl, FLD_MBGFRM_FONT, 10, 5,
                              MENU_WIN_PAL, MENU_WIN_CGX_NUM, poke, HEAPID_FIELD );

#if	GS_AFTERMASTER_SYSTEM1601_20091016_FIX
#else
    //図鑑見たフラグをセット
    Scr_ZukanSeeSet( core->fsys, PokeParaGet(poke,ID_PARA_monsno,NULL) );
#endif
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケモンウィンドウ削除
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPokeWindowDel( VM_MACHINE * core )
{
    u8* end_flag;
    void** pwork= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );

    end_flag	= *pwork;
    //*end_flag	= 1;
    *end_flag	= POKEWIN_CMD_END;
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケモンウィンドウアニメ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPokeWindowAnm( VM_MACHINE * core )
{
    u8* end_flag;
    void** pwork= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );

    end_flag	= *pwork;
    //*end_flag	= 1;
    *end_flag	= POKEWIN_CMD_ANM;
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケモンウィンドウアニメウェイト
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPokeWindowAnmWait( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16 wk_id			= VMGetU16( core );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, EvWaitPokeWindowAnmWait );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitPokeWindowAnmWait(VM_MACHINE * core)
{
    u8* end_flag;
    void** pwork= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );
    u16* ret_wk = GetEventWorkAdrs( core->fsys, core->reg[0] );	//注意！

    end_flag	= *pwork;

    if( *end_flag == POKEWIN_CMD_MOVE ){
        return 0;
    }

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * バトルサーチャー：戦闘後に表示方向固定の動作コードをセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBtlSearcherDirMvSet( VM_MACHINE * core )
{
    FIELD_OBJ_PTR* fldobj = GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_TARGET_OBJ);//話掛対象OBJ

	Overlay_Load( FS_OVERLAY_ID( field_revenge ), OVERLAY_LOAD_NOT_SYNCHRONIZE );
    if( *fldobj != NULL ){
        BS_MvReWarClearDirMvSet( core->fsys, *fldobj );
    }
	Overlay_UnloadID( FS_OVERLAY_ID( field_revenge ) );

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * プロフィール登録少年
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdProfileBoyEvent( VM_MACHINE * core )
{
	u16* ret_wk = VMGetWork(core);
	PROFILEBOY_EventStart( core->event_work, ret_wk );
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * イメージクリップ呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdImageClipSetProc( VM_MACHINE * core )
{
    u16	pos = VMGetWorkValue(core);
    u16* p_result = VMGetWork( core );
    u16	reference = VMGetWorkValue(core);

    // イベントコール
    EventCmd_ImcClipTvStart( core->fsys->event, p_result, core->fsys->savedata, pos, reference );
    return 1;
}

//----------------------------------------------------------------------------
/**
 *	@brief	テレビドレスアップビューアー
 *
 *	@param	core		仮想マシン制御構造体へのポインタ
 *
 *	@return "1"
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdImageClipPreviewTvProc( VM_MACHINE * core )
{
    void** buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    int data_idx = VMGetU16(core);
    u16* p_work = VMGetWork( core );

    //イメージクリップデータ作成
    *buf = ImageClipViewer_DataMake( HEAPID_WORLD, core->fsys, IMC_PREV_TV, data_idx );

    if( *buf == NULL ){
        *p_work = 1;
        // データがまだ設定されていない
        return 1;
    }
    *p_work = 0;
    FieldImageClipViewer_SetProc( core->fsys, *buf );			//イメージクリッププロックセット
    VM_SetWait( core, EvWaitSubProcAndFree );
    return 1;
}


//----------------------------------------------------------------------------
/**
 *	@brief	テレビドレスアップ	セーブデータ有無チェック
 *
 *	@param	core		仮想マシン制御構造体へのポインタ
 *
 *	@return "1"
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdImageClipTvSaveDataCheck( VM_MACHINE * core )
{
    BOOL result;
    int data_idx = VMGetU16(core);
    u16* p_work = VMGetWork( core );

    result = ImageClip_SaveDataCheck( core->fsys, IMC_PREV_TV, data_idx );

    if( result == TRUE ){
        *p_work = 1;	// あった！
        return 1;
    }
    *p_work = 0;	// なし！
    return 1;
}

//----------------------------------------------------------------------------
/**
 *	@brief	テレビ局　タイトル　入力処理
 *
 *	@param	core		仮想マシン制御構造体へのポインタ
 *
 *	@return "1"
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdImageClipTvSaveTitle( VM_MACHINE * core )
{
    u16 pms_data = VMGetWorkValue(core);
    IMC_SAVEDATA* iw = SaveData_GetImcSaveData( core->fsys->savedata );
    IMC_TELEVISION_SAVEDATA* p_tv = ImcSaveData_GetTelevisionSaveData( iw, 0 );

    ImcSaveData_SetTelevisionTitlePmsWord( p_tv, pms_data );

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 地球儀呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWifiEarthSetProc( VM_MACHINE * core )
{
    Field_WifiEarth_SetProc( core->fsys );
    VM_SetWait( core, EvCmdWaitSubProcEnd );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 	ボールカスタマイズ呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCustomBallEventCall( VM_MACHINE * core )
{
    EventCmd_CustomBallEditProc(core->event_work, core->fsys->savedata);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * タウンマップBGモード呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTMapBGSetProc( VM_MACHINE * core )
{
    void** buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

	*buf = FieldPGearSky_SetProc(core->fsys,PGSKY_CALL_BG);
    VM_SetWait( core, EvWaitSubProcAndFree );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * タワーアプリ呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBTowerAppSetProc( VM_MACHINE * core )
{
    BTOWER_APP_PARAM* ap;
    u16	main = VMGetWorkValue(core);
    u16	sub = VMGetWorkValue(core);

    void** buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

    *buf = sys_AllocMemory(HEAPID_WORLD, sizeof(BTOWER_APP_PARAM));

    ap = (BTOWER_APP_PARAM*)*buf;
    MI_CpuClear8(ap,sizeof(BTOWER_APP_PARAM));

    ap->mainMode = main;
    ap->subMode = sub;
    ap->save = core->fsys->savedata;

    BTowerApp_SetProc( core->fsys, *buf );
    VM_SetWait( core, EvWaitSubProcAndFree );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ボックス呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBoxSetProc( VM_MACHINE * core )
{
    void** buf				= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    BOX_PROC_PARAM* param	= sys_AllocMemory( HEAPID_WORLD, sizeof(BOX_PROC_PARAM) );

    param->savedata			= core->fsys->savedata;
    param->mode				= VMGetU8(core);
	param->kt_status		= &core->fsys->KeyTouchStatus;
    *buf = param;

    FieldBox_SetProc( core->fsys, *buf );					//ボックスプロックセット
    VM_SetWait( core, EvWaitBoxProcAndFree );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * おえかき呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdOekakiBoardSetProc( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = core->fsys;

    OekakiBoard_SetProc( fsys );
    VM_SetWait( core, EvCmdWaitSubProcEnd );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * トレーナーカード呼び出し	(他人のカード参照用)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCallTrCard( VM_MACHINE * core )
{
    TRCSET_SetupTrCardEvent(core->fsys);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * こうかん呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTradeListSetProc( VM_MACHINE * core )
{
    EventCmd_UnionTrade(core->fsys->event);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * レコードコーナー呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdRecordCornerSetProc( VM_MACHINE * core )
{
    void** buf				= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    *buf = RecordCorner_SetProc( core->fsys );
    //VM_SetWait( core, EvCmdWaitSubProcEnd );
    VM_SetWait( core, EvWaitSubProcAndFree );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 殿堂入り呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdDendouSetProc( VM_MACHINE * core )
{
    u16	mode = VMGetU16( core );

    EventCmd_GameClear( core->fsys->event, mode );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * パソコン殿堂入り呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPcDendouSetProc( VM_MACHINE * core )
{
    void** buf				= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    *buf = Field_DendouPC_Call(core->fsys);
#ifdef	PM_DEBUG
    //不要なはずだが、エラー対処
    if (*buf == NULL) {
        return 0;
    }
#endif
    VM_SetWait(core, EvWaitSubProcAndFree);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 殿堂入りデータチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPcDendouDataCheck( VM_MACHINE * core )
{
	u16 *ret;
	LOAD_RESULT result;
	DENDOU_SAVEDATA *dd;

	dd = SaveData_Extra_LoadDendouData(
			core->fsys->savedata, HEAPID_FIELD, &result );

	ret = VMGetWork( core );
	*ret = 0;

	if( result == LOAD_RESULT_NG ){
		*ret = 1;
	}

	sys_FreeMemoryEz( dd );
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 世界交換画面呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWorldTradeSetProc( VM_MACHINE * core )
{
    u16 no		= VMGetWorkValue(core);
    u16* ret_wk = VMGetWork(core);

    if( mydwc_checkMyGSID(core->fsys->savedata) ){
        *ret_wk = 1;	//成功
        Field_WorldTrade_SetProc( core->fsys, no );
        VM_SetWait( core, EvCmdWaitSubProcEnd );
    }else{
        *ret_wk = 0;	//失敗
    }

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * WIFI接続し初回ID取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdDPWInitProc( VM_MACHINE * core )
{
    u16 wk_id	= VMGetU16( core );

    //EventCmd_DPWInitProc( core->event_work );
    EventCmd_DPWInitProc2( core->event_work , GetEventWorkAdrs(core->fsys,wk_id) );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 最初のポケモン選択画面呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFirstPokeSelectProc( VM_MACHINE * core )
{
	PokeSelectCall_SetupEvent(core->fsys);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	バッグ画面のよびだし
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBagSetProc( VM_MACHINE * core )
{
    void ** buf;
    u8 mode;
    if (VMGetU8(core) == 0) {
        mode = EVBAG_MODE_NORMAL_ONLY;
    } else {
        mode = EVBAG_MODE_KINOMI_ONLY;
    }
    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    GF_ASSERT(*buf == 0);
    *buf = FieldBagEvent_SetProc(core->fsys, mode);

    VM_SetWait( core, EvCmdWaitSubProcEnd );
    return 1;
}
//--------------------------------------------------------------------------------------------
/**
 * @brief	バッグ画面での結果取得
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBagGetResult( VM_MACHINE * core)
{
    u16 * ret_wk;
    void ** buf;
    ret_wk = VMGetWork(core);
    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    GF_ASSERT(*buf != 0);
    *ret_wk = FieldBagEvent_GetSelectedItem(*buf);
    sys_FreeMemoryEz(*buf);
    *buf = NULL;
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ショップアプリ画面のよびだし
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdShopSetProc( VM_MACHINE * core )
{
    void ** buf;
    u8 mode;

    if (VMGetU8(core) == 0) {
        mode = EVBAG_MODE_NORMAL_ONLY;
    } else {
        mode = EVBAG_MODE_KINOMI_ONLY;
    }
    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    GF_ASSERT(*buf == 0);
    *buf = FieldBagEvent_SetProc(core->fsys, mode);

    VM_SetWait( core, EvWaitSubProcAndFree );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 名前入力呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdNameIn( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;

    EventCmd_NameIn( core->event_work, NAMEIN_MYNAME, 0, NAMEIN_PERSON_LENGTH, 0, NULL, VMGetWork(core) );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ライバル名前入力呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdNameInRival( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;

    EventCmd_NameIn( core->event_work, NAMEIN_RIVALNAME, 0, NAMEIN_PERSON_LENGTH, 0, NULL, VMGetWork(core) );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケモン名前入力呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdNameInPoke( VM_MACHINE * core )
{
    STRCODE msg_buf[MONS_NAME_SIZE*2];		//サイズ確認！
    POKEMON_PARAM * poke;
    FIELDSYS_WORK* fsys = core->fsys;
    u16 pos				= VMGetWorkValue(core);

	//ポケモンへのポインタ取得
	if(pos == 0xFF){	//posが0xFFだったら虫取り大会
		FLD_MUSHITORI_WORK* fmw = MushitoriSysSt_GetWorkPointer(fsys);
		if(!fmw->get_f){
			return 1;
		}
		poke = fmw->fld_pp;
	}else{
		poke = PokeParty_GetMemberPointer( SaveData_GetTemotiPokemon(fsys->savedata), pos);
	}

    //ニックネーム取得
    PokeParaGet(poke, ID_PARA_nickname, msg_buf);

    EventCmd_NameIn(core->event_work, NAMEIN_POKEMON,PokeParaGet(poke,ID_PARA_monsno,NULL),
                    NAMEIN_POKEMON_LENGTH, pos, msg_buf, VMGetWork(core) );
    return 1;
}


//--------------------------------------------------------------------------------------------
/**
 * ぐるぐる交換呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGuru2SetProc( VM_MACHINE * core )
{
	void** buf				= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
	*buf = EventCmd_Guru2ProcWorkAlloc( core->fsys );
	VM_SetWait( core, EvWaitSubProcAndFree_Guru2 );
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	RomCode 取得
 *
 * @param	core	仮想マシン制御構造体へのポインタ
 *
 * @retval	static BOOL
 *
 */
//--------------------------------------------------------------
static BOOL EvCmdUnionGetRomCode( VM_MACHINE * core )
{
	u16* ret_wk	= VMGetWork( core );
	u8 code;

	code = Union_GetRomCode();

	///< 相手のRomCodeがDPなら 0
	if ( code == PokemonDP_GetRomCode() ){

		*ret_wk = 0;
	}
	else {

		*ret_wk = 1;
	}

	return 0;
}


//============================================================================================
//============================================================================================
//--------------------------------------------------------------
/**
 * @brief	簡易会話入力呼び出し（1単語&バトルメッセージ）
 *
 * 引数がおなじなので、単語モードとバトルメッセージ用は同じコマンドにまとめちゃう
 */
//--------------------------------------------------------------
static BOOL EvCmdPMSInputProc(VM_MACHINE * core)
{
    u16 mode = VMGetWorkValue(core);		//モード指定
    u16 * ret_wk = VMGetWork(core);
    u16 * ans_wk = VMGetWork(core);
    *ans_wk = PMS_WORD_NULL;
    EventCmd_PMSInput(core->fsys->event, mode, ret_wk, ans_wk, NULL);
    return 1;
}

//--------------------------------------------------------------
/**
 * @brief	簡易会話入力呼び出し（2単語）
 */
//--------------------------------------------------------------
static BOOL EvCmdPMSInputDoubleProc(VM_MACHINE * core)
{
    u16 * ret_wk = VMGetWork(core);
    u16 * ans_wk1 = VMGetWork(core);
    u16 * ans_wk2 = VMGetWork(core);
    *ans_wk1 = PMS_WORD_NULL;
    *ans_wk2 = PMS_WORD_NULL;
    EventCmd_PMSInput(core->fsys->event, EV_PMSINPUT_DOUBLE, ret_wk, ans_wk1, ans_wk2);
    return 1;
}

//--------------------------------------------------------------
/**
 * @brief	簡易会話の単語をバッファへ
 */
//--------------------------------------------------------------
static BOOL EvCmdPMSBuf(VM_MACHINE * core)
{
    WORDSET** wordset	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WORDSET );
    u16 buf_num = VMGetWorkValue(core);
    PMS_WORD word = VMGetWorkValue(core);

    WORDSET_RegisterPMSWord(*wordset,buf_num,word );

    return 0;
}

//============================================================================================
//
//	ワイプフェード関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * ワイプフェードスタート
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * 注意！　フェードにかかるLCD、BG面の設定は固定にしている
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWipeFadeStart( VM_MACHINE * core )
{
    u16 div				= VMGetU16(core);		//各ワイプ処理の分割数
    u16 sync			= VMGetU16(core);		//各ワイプの処理を分割した１片のシンク数
    u16 type			= VMGetU16(core);		//タイプ
    u16 color			= VMGetU16(core);		//カラー

    WIPE_SYS_Start( WIPE_PATTERN_WMS, type, type, color, div, sync, HEAPID_FIELD );

    //ウィンドウマスク状態を解除
    WIPE_ResetWndMask( WIPE_DISP_MAIN );
    WIPE_ResetWndMask( WIPE_DISP_SUB );

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ワイプフェード終了チェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 *
 * 注意！　チェックするLCDの設定は固定にしている
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWipeFadeCheck( VM_MACHINE * core )
{
    VM_SetWait( core, EvWaitWipeFadeCheck );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitWipeFadeCheck(VM_MACHINE * core)
{
    if( WIPE_SYS_EndCheck() == TRUE ){
        return 1;
    }

    return 0;
}


//============================================================================================
//
//	マップ遷移関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * マップ遷移
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdMapChange( VM_MACHINE * core )
{
    u16 zone_id,x,z,dir;
    s16 door_id;
    FIELDSYS_WORK * fsys = core->fsys;

	zone_id = VMGetWorkValue(core);			//08.04.28 変更
    door_id = VMGetU16(core);
    x		= VMGetWorkValue(core);
    z		= VMGetWorkValue(core);
	dir		= VMGetWorkValue(core);			//08.05.08 変更
    door_id = DOOR_ID_JUMP_CODE;

    EventCmd_MapChangeFull(core->event_work, zone_id, door_id, x, z, dir );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * マップ遷移(コロシアム)イン
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdColosseumMapChangeIn( VM_MACHINE * core )
{
    u16 zone_id,x,z,dir;
    s16 door_id;
    FIELDSYS_WORK * fsys = core->fsys;

    zone_id = VMGetU16(core);
    door_id = VMGetU16(core);
    x		= VMGetWorkValue(core);
    z		= VMGetWorkValue(core);
    dir		= VMGetU16(core);
    door_id = DOOR_ID_JUMP_CODE;


    EventCmd_ColosseumMapChangeIn(core->fsys->event, zone_id, door_id, x, z, dir );
    //EventCmd_MapChangeFull(core->event_work, zone_id, door_id, x, z, dir );
    return 1;
}
//--------------------------------------------------------------------------------------------
/**
 * マップ遷移(コロシアム)アウト
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdColosseumMapChangeOut( VM_MACHINE * core )
{
    EventCmd_ColosseumMapChangeOut( core->fsys->event );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 前のゾーンIDを取得する
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetBeforeZoneID( VM_MACHINE * core)
{
    SITUATION* sit			= SaveData_GetSituation( core->fsys->savedata );
    LOCATION_WORK* before	= Situation_GetBeforeLocation( sit );
    u16 * ret_wk			= VMGetWork(core);

    OS_Printf( "before->zone_id = %d\n", before->zone_id );
    *ret_wk = before->zone_id;
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 現在のゾーンIDを取得する
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetNowZoneID( VM_MACHINE * core)
{
    u16 * ret_wk = VMGetWork(core);
    *ret_wk = core->fsys->location->zone_id;
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケセンチェック
 * ret_wk	0:ポケセンじゃない
 * ret_wk	1:通常のポケセン
 * ret_wk	2:セキエイ（チャンピオンリーグ）のポケセン施設
 *
 * ポケセン地下はチェック外
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCheckPokecenZoneID( VM_MACHINE * core )
{
	u16 zone_id = VMGetWorkValue(core);
	u16 * ret_wk = VMGetWork(core);

	*ret_wk = 0;

	if (ZoneData_IsPokecen2F(zone_id) == TRUE) {
		*ret_wk = 1;
	} else if (ZoneData_IsPokecenSekiei(zone_id) == TRUE) {
		*ret_wk = 2;
	}
	return 0;
}

//============================================================================================
//
//	秘伝技関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 壁のぼり
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdKabeNobori( VM_MACHINE * core )
{
    EventCmd_KabeNoboriCall( core->event_work,
                             Player_DirGet(core->fsys->player), VMGetWorkValue(core) );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * なみのり
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdNaminori( VM_MACHINE * core )
{
    EventCmd_NaminoriCall( core->event_work,
                           Player_DirGet(core->fsys->player), VMGetWorkValue(core) );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * たきのぼり
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTakinobori( VM_MACHINE * core )
{
    EventCmd_TakiNoboriCall( core->event_work,
                             Player_DirGet(core->fsys->player), VMGetWorkValue(core) );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * そらをとぶ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSorawotobu( VM_MACHINE * core )
{
    u16 zone_id,x,z;

    zone_id = VMGetU16(core);
    x		= VMGetWorkValue(core);
    z		= VMGetWorkValue(core);

    EventSet_MapChangeBySky( core->fsys, zone_id, DOOR_ID_JUMP_CODE, x, z, DIR_DOWN );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	秘伝わざ：フラッシュ
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdHidenFlash(VM_MACHINE * core)
{
    SITUATION * sit = SaveData_GetSituation(core->fsys->savedata);
    Situation_SetWeatherID(sit, WEATHER_SYS_FLASH2);
    WEATHER_ChengeReq(core->fsys->fldmap->weather_data, Situation_GetWeatherID(sit));

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * うずしお
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUzusio( VM_MACHINE * core )
{
    EventCmd_UzusioCall( core->event_work,
                             Player_DirGet(core->fsys->player), VMGetWorkValue(core) );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * カットイン
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 *
 * @li ID_EVSCR_PWORK使用！
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCutIn( VM_MACHINE * core )
{
    POKEMON_PARAM * poke;
    void** pwork	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );
    u16 pos			= VMGetWorkValue(core);

    //ポケモンへのポインタ取得
    poke = PokeParty_GetMemberPointer( SaveData_GetTemotiPokemon(core->fsys->savedata), pos );

    *pwork = FieldCutIn_Init(
        core->fsys, CUTIN_TYPE_HIDEN,
        poke, Player_SexGet(core->fsys->player) );

    VM_SetWait( core, EvWaitCutIn );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitCutIn(VM_MACHINE * core)
{
    void** pwork	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );

    if( FieldCutIn_EndCheck(*pwork) == TRUE ){
        FieldCutIn_End( *pwork );
        return 1;
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 自転車に乗っているかチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBicycleCheck( VM_MACHINE * core )
{
    u16* ret_wk	= VMGetWork( core );

    if( Player_FormGet(core->fsys->player) == HERO_FORM_CYCLE ){
        *ret_wk = 1;
    }else{
        *ret_wk = 0;
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 自転車、歩行形態に変更
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBicycleReq( VM_MACHINE * core )
{
    u8 flag	= VMGetU8( core );

    if( flag == 1 ){
        //先にBGM処理を呼んでから、形状を自転車にする！(060803)
        Snd_FieldBgmSetSpecial( core->fsys, SEQ_GS_BICYCLE );				//セット
        Snd_FadeOutNextPlayCall( core->fsys, SEQ_GS_BICYCLE, BGM_FADE_FIELD_MODE );
        Player_RequestSet( core->fsys->player, HERO_REQBIT_CYCLE );		//自転車
        Player_Request( core->fsys->player );
    }else{
        //先に形状を戻してから、BGM処理を呼ぶ！(060803)
        Player_RequestSet( core->fsys->player, HERO_REQBIT_NORMAL );	//歩行
        Player_Request( core->fsys->player );
        Snd_FieldBgmSetSpecial( core->fsys, 0 );						//クリア
        Snd_FadeOutNextPlayCall(core->fsys,
                                Snd_FieldBgmNoGet(core->fsys,core->fsys->location->zone_id),
                                BGM_FADE_FIELD_MODE );
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * サイクリングロード専用　プラチナで処理を変更
 *
 * SEQ_PL_BICYCLEのマップ有効フラグを立てる
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBicycleReqNonBgm( VM_MACHINE * core )
{
	//サイクリングロード専用セット処理(このコマンドは他では使用してはいけません！)

	Snd_FieldBgmSetSpecial( core->fsys, SEQ_PL_BICYCLE );			//PLセット
   return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * サイクリングロードセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCyclingRoadSet( VM_MACHINE * core )
{
    Player_MoveBitSet_CyclingRoad( core->fsys->player, VMGetU8(core) );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 自機の形態を取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPlayerFormGet( VM_MACHINE * core )
{
    u16* ret_wk	= VMGetWork( core );
    *ret_wk = Player_FormGet( core->fsys->player );
    OS_Printf( "player form ret_wk = %d\n", *ret_wk );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 自機へリクエスト
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPlayerReqBitOn( VM_MACHINE * core )
{
    u16 bit	= VMGetU16( core );
    Player_RequestBit_ON( core->fsys->player, bit );
    return 1;
}
//--------------------------------------------------------------------------------------------
/**
 * 自機リクエスト実行
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPlayerReqStart( VM_MACHINE * core )
{
    Player_Request( core->fsys->player );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 大量発生ゾーンを取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGenerateInfoGet(VM_MACHINE * core )
{
    ENC_SV_PTR data = EncDataSave_GetSaveDataPtr(core->fsys->savedata);
    u16* ret_zone		= VMGetWork( core );
    u16* ret_poke		= VMGetWork( core );

    GenerateZone_GetInfo( EncDataSave_GetRandSeed(data, ENC_RND_SEED_GENERATE), ret_zone, ret_poke );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 最初のポケモンナンバー取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFirstPokeNoGet(VM_MACHINE * core )
{
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = SysWork_FirstPokeNoGet( SaveData_GetEventWork(core->fsys->savedata) );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 最初のポケモンナンバーセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFirstPokeNoSet(VM_MACHINE * core )
{
    u16 pokeno = VMGetWorkValue( core );

    SysWork_FirstPokeNoSet( SaveData_GetEventWork(core->fsys->savedata),pokeno );
    return 0;
}


//============================================================================================
//
//	戦闘関連(実験中)
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * トレーナー会話呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTrainerMessageSet( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys	= core->fsys;
    u16* script_id			= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_SCRIPT_ID );
    STRBUF** pbuf			= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_MSGBUF );
//  u8* win_open_flag		= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WIN_OPEN_FLAG );
    u8* msg_index			= GetEvScriptWorkMemberAdrs( fsys,ID_EVSCR_MSGINDEX );
    u16 tr_id				= VMGetWorkValue(core);
    u16 kind_id				= VMGetWorkValue(core);

    TT_TrainerMessageGet( tr_id, kind_id, *pbuf, HEAPID_WORLD );

    //メッセージクリア
    GF_BGL_BmpWinDataFill( GetEvScriptWorkMemberAdrs(fsys, ID_EVSCR_MSGWINDAT), (FBMP_COL_WHITE) );

    *msg_index = FieldTalkMsgStart( GetEvScriptWorkMemberAdrs(fsys,ID_EVSCR_MSGWINDAT),
                                    *pbuf, SaveData_GetConfig(core->fsys->savedata), 1 );

    VM_SetWait( core, TalkMsgWait );
    return 1;
}


//============================================================================================
//
//	通信関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 親機を選択するウィンドウを開く
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdConnectSelParentWin( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16 mode			= VMGetWorkValue(core);	//battle_mode
    u16 type			= VMGetWorkValue(core);	//regulation_type
    u16 type2			= VMGetWorkValue(core);	//
    u16 wk_id			= VMGetU16( core );

    CommSelectParentWindowOpen( fsys, mode, type, type2 );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, EvWaitConnectSelParentWin );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitConnectSelParentWin( VM_MACHINE * core )
{
    u32 ret;
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk			= GetEventWorkAdrs( fsys, core->reg[0] );	//注意！

    ret = CommSelectParentWindowCheck();
    if( ret == COMM_RETVAL_NULL ){
        return 0;					//選択中
    }

    *ret_wk = ret;					//戻り値格納
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 子機を選択するウィンドウを開く
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdConnectSelChildWin( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16 mode			= VMGetWorkValue(core);	//battle_mode
    u16 type			= VMGetWorkValue(core);	//regulation_type
    u16 type2			= VMGetWorkValue(core);	//
    u16 wk_id			= VMGetU16( core );

    CommChildWindowOpen( fsys, mode, type, type2 );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, EvWaitConnectSelChildWin );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitConnectSelChildWin( VM_MACHINE * core )
{
    u32 ret;
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk			= GetEventWorkAdrs( fsys, core->reg[0] );	//注意！

    ret = CommChildWindowCheck();
    if( ret == COMM_RETVAL_NULL ){
        return 0;					//選択中
    }

    *ret_wk = ret;					//戻り値格納
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * デバック親機を選択するウィンドウを開く
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdConnectDebugParentWin( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16 wk_id			= VMGetU16( core );

#ifdef PM_DEBUG
    CommDirectParent_Debug( fsys );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, EvWaitConnectSelParentWin );
#endif
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * デバック子機を選択するウィンドウを開く
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdConnectDebugChildWin( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16 wk_id			= VMGetU16( core );

#ifdef PM_DEBUG
    CommDirectChild_Debug( fsys );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, EvWaitConnectSelChildWin );
#endif
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * デバック用　通信戦闘呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdDebugSioEncount( VM_MACHINE * core )
{
    PLIST_DATA * pld;
    void ** buf;
    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    pld = *buf;
    EventCmd_TemotiListBattle(core->fsys->event, pld->in_num, FIGHT_TYPE_1vs1_SIO);
    sys_FreeMemoryEz(pld);
    *buf = NULL;
    //u8 * array = sys_AllocMemoryLo(HEAPID_EVENT, sizeof(u8) * 6);
    //EventCmd_TemotiListBattle(core->fsys->event, array, FIGHT_TYPE_1vs1_SIO);
    //sys_FreeMemoryEz(array);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * デバック用　通信コンテスト呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdDebugSioContest( VM_MACHINE * core )
{
    return 1;
}


//============================================================================================
//
//	特殊接続関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 特殊接続情報のセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSpLocationSet( VM_MACHINE * core )
{
    LOCATION_WORK lw;

    lw.zone_id	= VMGetWorkValue( core );
    lw.door_id	= VMGetWorkValue( core );
    lw.grid_x	= VMGetWorkValue( core );
    lw.grid_z	= VMGetWorkValue( core );
    lw.dir		= VMGetWorkValue( core );

    Situation_SetSpecialLocation( SaveData_GetSituation(core->fsys->savedata), &lw );
    return 0;
}


//============================================================================================
//
//	エレベータ関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 特殊接続先から、現在のフロアナンバーを取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdElevatorNowFloorGet( VM_MACHINE * core )
{
    LOCATION_WORK* location;
    u16* wk				= VMGetWork( core );

    location = Situation_GetSpecialLocation( SaveData_GetSituation(core->fsys->savedata) );

    //特殊接続先から、現在のフロアナンバーを取得
    *wk = ElevatorNowFloorGet( location->zone_id );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 現在のフロアナンバーを表示
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdElevatorFloorWrite( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    WORDSET** wordset	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );
    u8 x				= VMGetU8(core);
    u8 y				= VMGetU8(core);
    u16* wk				= VMGetWork(core);
	u16 floor			= VMGetWorkValue(core);			//プラチナ追加

	ElevatorFloorWrite( fsys, x, y, wk, *wordset, floor );
    return 0;
}


//============================================================================================
//
//	図鑑評価関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * ジョウト図鑑　見つけた数を取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetJohtoZukanSeeNum( VM_MACHINE * core )
{
    const ZUKAN_WORK* zw = SaveData_GetZukanWork( core->fsys->savedata );
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = ZukanWork_GetJohtoPokeSeeCount(zw);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ジョウト図鑑　捕まえた数を取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetJohtoZukanGetNum( VM_MACHINE * core )
{
    const ZUKAN_WORK* zw = SaveData_GetZukanWork( core->fsys->savedata );
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = ZukanWork_GetJohtoPokeGetCount(zw);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 全国図鑑　見つけた数を取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetZenkokuZukanSeeNum( VM_MACHINE * core )
{
    const ZUKAN_WORK* zw = SaveData_GetZukanWork( core->fsys->savedata );
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = ZukanWork_GetPokeSeeCount(zw);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 全国図鑑　捕まえた数を取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetZenkokuZukanGetNum( VM_MACHINE * core )
{
    const ZUKAN_WORK* zw = SaveData_GetZukanWork( core->fsys->savedata );
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = ZukanWork_GetPokeGetCount(zw);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 全国図鑑かチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdChkZenkokuZukan( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;

    //*ret_wk = (u16)ZukanSpecialFlagCheck();
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 評価メッセージID取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetZukanHyoukaMsgID( VM_MACHINE * core )
{
    const ZUKAN_WORK* zw= SaveData_GetZukanWork( core->fsys->savedata );
    const MYSTATUS *my = SaveData_GetMyStatus(core->fsys->savedata);
    u8 mode				= VMGetU8(core);
    u16* ret_wk			= VMGetWork( core );
    u16* me_no			= VMGetWork( core );
    u16 num;

    if( mode == 0 ){
        num = ZukanWork_GetJohtoGetCompCount( zw );
		*ret_wk = GetJohtoZukanHyoukaMsgID( num , MyStatus_GetMySex(my), me_no);
    }else{
        num = ZukanWork_GetZenkokuGetCompCount( zw );
        *ret_wk = GetZenkokuZukanHyoukaMsgID( num , MyStatus_GetMySex(my), me_no);
    }

    return 0;
}


//============================================================================================
//
//	野生戦闘関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * ポケモンナンバーとレベルを指定して野生戦闘呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWildBattleSet( VM_MACHINE * core )
{
    BOOL* win_flag	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WIN_FLAG );
    u16 monsno		= VMGetWorkValue(core);
    u8 level		= (u8)VMGetWorkValue(core);

    //イベントコールなので、スクリプトに復帰します。
    EventCmd_WildBattle( core->event_work, monsno, level, win_flag,FALSE ,FALSE);

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケモンナンバーとレベルを指定して特殊ポケモンイベント野生戦闘呼び出し
 * ※ノーマルとはエンカウントメッセージが違います
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSpWildBattleSet( VM_MACHINE * core )
{
    BOOL* win_flag	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WIN_FLAG );
    u16 monsno		= VMGetWorkValue(core);
    u8 level		= (u8)VMGetWorkValue(core);
    u8 rare_f		= VMGetU8(core);

    //イベントコールなので、スクリプトに復帰します。
    EventCmd_WildBattle( core->event_work, monsno, level, win_flag,TRUE, rare_f);

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケモンナンバーとレベルを指定して特殊ポケモンイベント野生戦闘呼び出し
 * ※ノーマルとはエンカウントメッセージが違います
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 *
 * ★ID_PARA_event_get_flagをセットします(シェイミ用に使用しています 08.04.05)
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdEventGetWildBattleSet( VM_MACHINE * core )
{
	BOOL* win_flag	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WIN_FLAG );
	u16 monsno		= VMGetWorkValue(core);
	u8 level		= (u8)VMGetWorkValue(core);

	//イベントコールなので、スクリプトに復帰します。
	EventCmd_WildBattleEventGet( core->event_work, monsno, level, win_flag,TRUE );

	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 最初のイベント戦闘呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFirstBattleSet( VM_MACHINE * core )
{
    //BOOL* win_flag	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WIN_FLAG );
    u16 monsno		= VMGetWorkValue(core);
    u8 level		= (u8)VMGetWorkValue(core);

    //イベントコールなので、スクリプトに復帰します。
    EventCmd_FirstBattle( core->event_work, monsno, level );

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 捕獲デモのイベント戦闘呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCaptureBattleSet( VM_MACHINE * core )
{
    EventCmd_CaptureDemo( core->event_work );
    return 1;
}


//--------------------------------------------------------------------------------------------
/**
 * サイン呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTSignSetProc( VM_MACHINE * core )
{
    Field_MySign_SetProc( core->fsys );
    VM_SetWait( core, EvCmdWaitSubProcEnd );
    return 1;
}


//============================================================================================
//
//	レポートセーブ関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * レポートデータチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdReportSaveCheck( VM_MACHINE * core )
{
    SAVEDATA * savedata = core->fsys->savedata;
    u16* ret_wk			= VMGetWork( core );

    if (SaveData_IsOverwritingOtherData(savedata)) {
        //「さいしょから」で既にセーブデータが存在する場合＝書き込み禁止
        *ret_wk = 0;
    } else if (SaveData_GetExistFlag(savedata) == FALSE) {
        //セーブデータが存在しない＝初回セーブ（全体セーブ）
        *ret_wk = 1;
    } else if (SaveData_GetTotalSaveFlag(savedata)) {
        //セーブデータが存在して、全体セーブの場合
        *ret_wk = 2;
    } else {
        //セーブデータが存在して、部分セーブの場合
        *ret_wk = 3;
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * レポート書き込み
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdReportSave( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16 * ret_wk = VMGetWork(core);
    *ret_wk = Field_Save(fsys);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 外部セーブの初期化
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdExtraSaveInit( VM_MACHINE * core )
{
	SVDT_ExtraInit( core->fsys->savedata );
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 外部セーブが初期化済みかチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdExtraSaveInitCheck( VM_MACHINE * core )
{
	u16* ret_wk	= VMGetWork( core );
	*ret_wk = SaveData_GetExtraInitFlag( core->fsys->savedata );
	return 0;
}

//============================================================================================
//
//	通信関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * タイミングコマンドを発行する
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCommTimingSyncStart( VM_MACHINE * core )
{
    u16 no = VMGetWorkValue( core );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = no;

    CommTimingSyncStart( no );

    VM_SetWait( core, EvWaitCommIsTimingSync );

    OS_Printf("同期待ち　番号＝%d\n",no);

    return 1;
}

//return 1 = 終了
static BOOL EvWaitCommIsTimingSync(VM_MACHINE * core)
{
    int result;
    if(CommGetConnectNum()<2){
        result = 1;
    }else{
        result = CommIsTimingSync( core->reg[0] );
    }
    return result;
}

//--------------------------------------------------------------------------------------------
/**
 * リセットコマンドを発行する
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCommTempDataReset( VM_MACHINE * core )
{
    CommToolTempDataReset();
    return 0;
}


//============================================================================================
//
//	ユニオン関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * ユニオンルーム 通信の親機側でカードを見る前の会話番号を取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionParentCardTalkNo( VM_MACHINE * core )
{
    FIELDSYS_WORK *fsys = core->fsys;
    WORDSET** wordset	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );
    u16* ret_wk	        = VMGetWork( core );

    *ret_wk = Union_GetCardTalkNo( *wordset );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ユニオンルーム 左上の人の話すメッセージID取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionGetInfoTalkNo( VM_MACHINE * core )
{
    u16* ret_wk	        = VMGetWork( core );
    FIELDSYS_WORK *fsys = core->fsys;

    WORDSET** wordset	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );

    *ret_wk = Union_GetInfomationTalkNo( core->fsys->union_work, *wordset );
    return 0;
}


//--------------------------------------------------------------------------------------------
/**
 * ユニオンルーム ビーコン書き換え
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionBeaconChange( VM_MACHINE * core )
{
    // ビーコン書き換えの際に子機も自分の接続モードを変更するようにする
    u16 mode = VMGetU16(core);

    // 通信モードをユニオンアプリケーションモードに変更
    if( mode==UNION_PARENT_MODE_CARDNOW
	 || mode==UNION_PARENT_MODE_TRADENOW
	 || mode==UNION_PARENT_MODE_RECORDNOW
	 || mode==UNION_PARENT_MODE_BATTLENOW
	 || mode==UNION_PARENT_MODE_GURU2
	 || mode==UNION_PARENT_MODE_GURUGURUNOW )
    {
        CommStateUnionAppStart();
    }else if( mode==UNION_PARENT_MODE_PARTY ){
        // アプリケーションモードから戻す
        CommStateUnionAppEnd();
    }

    // 親機の場合はビーコン書き換え
    if(CommGetCurrentID()==0){
        Union_BeaconChange( mode );
    }
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ユニオンルーム内で使用する会話用にトレーナー名をセットする
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionTrainerNameRegist( VM_MACHINE * core )
{
    FIELD_OBJ_PTR* fldobj	= GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_TARGET_OBJ);//対象OBJ
    WORDSET** wordset		= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WORDSET );
    u16 type				= VMGetU16( core );
    MYSTATUS* my			= SaveData_GetMyStatus( GameSystem_GetSaveData(core->fsys) );
    PMSW_SAVEDATA *pmssave  = SaveData_GetPMSW( GameSystem_GetSaveData(core->fsys) );
    u16 no;

    if( type == UNION_TALK_CHILD ){
        no = FieldOBJ_OBJIDGet( *fldobj );
    }else{
        no = 0;
    }

    Union_TrainerNameRegist( *wordset, type, no, my, pmssave );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * フィールド用のコマンド体系に初期化
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionReturnSetUp( VM_MACHINE * core )
{
    // ここにツウシンモードを「ユニオン話しかけ」に戻すコードを入れる
    CommCommandFieldInitialize( core->fsys );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ビーコン収集を再開する
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionConnectCutRestart( VM_MACHINE * core )
{
    FIELDSYS_WORK *fsys = core->fsys;

    UnionRoomView_ObjAllRise( fsys->union_view );
//	UnionRoomView_ObjInit( fsys->union_view );
    CommStateUnionBconCollectionRestart();

    VM_SetWait( core, EvWaitCommConnectCountZero );


    return 1;
}

//return 1 = 終了
static BOOL EvWaitCommConnectCountZero(VM_MACHINE * core)
{
    return (CommGetConnectNum()<2);
}

//--------------------------------------------------------------------------------------------
/**
 * 話しかけで通信接続できない時に出す会話のインデックスを取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionGetTalkNumber( VM_MACHINE * core )
{
    FIELD_OBJ_PTR* fldobj = GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_TARGET_OBJ);//話掛対象OBJ
    u16 type			  = VMGetU16( core );
    u16* ret_wk			  = VMGetWork( core );
    WORDSET** wordset	  = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WORDSET );

    *ret_wk = Union_GetTalkNumber( core->fsys->union_work, FieldOBJ_OBJIDGet(*fldobj), type, *wordset );
    return 0;
}

//------------------------------------------------------------------
/**
 * @brief   バトル開始の選択はどうなったのかを取得する
 *
 * @param   core
 *
 * @retval  BOOL
 */
//------------------------------------------------------------------
static BOOL EvCmdUnionBattleStartCheck( VM_MACHINE * core )
{
    PLIST_DATA * pld;
    void ** buf;
    u16* ret_wk			  = VMGetWork( core );


    // ポケモン選択結果取得
    *ret_wk = Union_GetBattleStartCheckResult( core->fsys->union_work );

    // 戦闘しないんだったらポケモンリストの選択結果データは破棄する
    if(*ret_wk!=UNION_BATTLE_OK){
        buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
        pld = *buf;
        sys_FreeMemoryEz(pld);
    }

    return 0;
}


//--------------------------------------------------------------------------------------------
/**
 * 話しかけOBJのIDをセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionIdSet( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys		= core->fsys;
    FIELD_OBJ_PTR* fldobj	= GetEvScriptWorkMemberAdrs(fsys,ID_EVSCR_TARGET_OBJ);//話し掛け対象OBJ
    u16* ret_wk				= VMGetWork( core );

    *ret_wk = Union_ConnectIdSet( fsys->union_work, FieldOBJ_OBJIDGet(*fldobj) );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ユニオンはなしかけ接続スタート（スクリプトからは話しかけOBJのIDを渡す）
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionConnectStart( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys		= core->fsys;
    FIELD_OBJ_PTR* fldobj	= GetEvScriptWorkMemberAdrs(fsys,ID_EVSCR_TARGET_OBJ);//話し掛け対象OBJ
    u16  type				= VMGetWorkValue( core );
    u16* ret_wk				= VMGetWork( core );

    *ret_wk = Union_ConnectStart( fsys->union_work, FieldOBJ_OBJIDGet(*fldobj), type );
    return 0;
}



//--------------------------------------------------------------------------------------------
/**
 * 話しかけで接続してみた結果を返す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionResultGet( VM_MACHINE * core )
{
    u16 wk_id = VMGetU16( core );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, EvWaitUnionResultGet );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitUnionResultGet(VM_MACHINE * core)
{
    FIELDSYS_WORK* fsys	= core->fsys;
    u32 ret				= Union_ConnectResultGet( fsys->union_work );
    u16* ret_wk			= GetEventWorkAdrs( fsys, core->reg[0] );	//注意！

//	OS_TPrintf("接続待ち ret=%d\n",ret);

    //途中だったら
    if( ret == 0 ){
        return 0;
    }

    *ret_wk = ret;
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ユニオンルームのOBJを隠す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionObjAllVanish( VM_MACHINE * core )
{
    FIELDSYS_WORK       *fsys = core->fsys;
    COMM_UNIONROOM_VIEW *view = fsys->union_view;

    Union_BeaconObjAllVanish( fsys->fldobjsys, view );

    return 0;
}


//--------------------------------------------------------------------------------------------
/**
 * ユニオンルームで話し掛け「られない」状態にする
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionConnectTalkDenied( VM_MACHINE * core )
{
    // 今忙しいにビーコン書き換え
    Union_BeaconChange( UNION_PARENT_MODE_BUSY );
    CommStateUnionPause();
    OS_Printf("ビーコン書き換え　＆　一旦接続拒否\n");

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ユニオンルームで話し掛け「られる」状態にもどす
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionConnectTalkOk( VM_MACHINE * core )
{
    // 話し掛けＯＫにする

    CommStateUnionAppEnd();
    CommStateUnionBconCollectionRestart();
    Union_BeaconChange( UNION_PARENT_MODE_FREE );
    OS_Printf("ビーコン書き換え　＆　接続許可\n");
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 選択した値をユニオンワークに渡す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionScriptResultSet( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys	 = core->fsys;
    u16 type = VMGetWorkValue(core);
    u16 num = VMGetWorkValue(core);
    Union_ScriptResultGet( fsys->union_work, type, num );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 親機のスタートを待つ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionParentStartCommandSet( VM_MACHINE * core )
{
    u16 wk_id = VMGetU16( core );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, EvWaitUnion_ParentStartCommandSet );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitUnion_ParentStartCommandSet(VM_MACHINE * core)
{
    u16* ret_wk	= GetEventWorkAdrs( core->fsys, core->reg[0] );	//注意！
    u32 ret		= Union_ParentStartCommandSet(core->fsys->union_work);

    if( ret >= 1 ){
        *ret_wk = ret;

        // ユニオンルーム内で送受信した内容をクリア（戻ってきた時の誤動作防止用）
        Union_CommWorkClear(core->fsys->union_work);

        return 1;
    }

    *ret_wk = 0;
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 子機の選択を待つ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionChildSelectCommandSet( VM_MACHINE * core )
{
    u16 wk_id = VMGetU16( core );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

    VM_SetWait( core, EvWaitUnion_ChildSelectCommandSet );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitUnion_ChildSelectCommandSet(VM_MACHINE * core)
{
    u16* ret_wk	= GetEventWorkAdrs( core->fsys, core->reg[0] );	//注意！
    u32 ret		= Union_ChildSelectCommandSet(core->fsys->union_work);

    // 話しかけられた側もキャンセルができる
    if(sys.trg & PAD_BUTTON_CANCEL){
        // ただし、子機からのイベント選択が到着していなければだが
        ret = Union_ParentSendCancel( core->fsys->union_work, UNION_PARENT_SELECT_CANCEL );
        OS_Printf("Bボタンがおされたが...");
        if(ret){
            OS_Printf("通った\n");
        }else{
            OS_Printf("子機の選択がきていたのでダメだった\n");
        }
    }

    if( ret != 0 ){
        *ret_wk = ret;
        return 1;
    }
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ユニオンルームに入る
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionMapChange( VM_MACHINE * core )
{
    EventCmd_UnionRoomMapChangeIn( core->fsys->event );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 4つの選択肢のトレーナーの名前をwordsetに格納する
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionViewSetUpTrainerTypeSelect( VM_MACHINE * core )
{
    MYSTATUS* my		= SaveData_GetMyStatus( GameSystem_GetSaveData(core->fsys) );
    WORDSET** wordset	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WORDSET );

    UnionView_SetUpTrainerTypeSelect( MyStatus_GetID(my), MyStatus_GetMySex(my), *wordset );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 選択した0-3の数字をトレーナーの見た目トレーナー文字列IDに変換
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionViewGetTrainerType( VM_MACHINE * core )
{
    MYSTATUS* my	= SaveData_GetMyStatus( GameSystem_GetSaveData(core->fsys) );
    u16 ans			= VMGetWorkValue(core);
    u16* ret_wk		= VMGetWork( core );

    //OS_Printf( "ans = %d\n", ans );

    //IDと選択肢から見た目番号を取得
    *ret_wk = UnionView_GetTrainerType( MyStatus_GetID(my), MyStatus_GetMySex(my), ans );
    //OS_Printf( "ret_wk = %d\n", *ret_wk );

    //見た目番号から、トレーナーの文字列IDを取得
    *ret_wk = UnionView_GetTrainerInfo( MyStatus_GetMySex(my), *ret_wk, UNIONVIEW_MSGTYPE );
    //OS_Printf( "ret_wk = %d\n", *ret_wk );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 選択した0-3の数字をトレーナーの見た目番号に変換する関数
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionViewGetTrainerTypeNo( VM_MACHINE * core )
{
    MYSTATUS* my	= SaveData_GetMyStatus( GameSystem_GetSaveData(core->fsys) );
    u16 ans			= VMGetWorkValue(core);
    u16* ret_wk		= VMGetWork( core );

    //OS_Printf( "ans = %d\n", ans );

    //IDと選択肢から見た目番号を取得
    *ret_wk = UnionView_GetTrainerType( MyStatus_GetID(my), MyStatus_GetMySex(my), ans );
    //OS_Printf( "ret_wk = %d\n", *ret_wk );

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 自分がトレーナーとして見られる時の番号をセット(ユニオンルーム用)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionViewMyStatusSet( VM_MACHINE * core )
{
    MYSTATUS* my	= SaveData_GetMyStatus( GameSystem_GetSaveData(core->fsys) );
    u16 type		= VMGetWorkValue(core);

    MyStatus_SetTrainerView( my, type );
    return 0;
}


//============================================================================================
//
//	ゲームオーバー関連
//
//============================================================================================
//--------------------------------------------------------------------------------------------
/**
 * ゲームオーバー呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGameOverCall( VM_MACHINE * core )
{
    //イベントコールなので、スクリプトに復帰します。
    EventCmd_NormalLose( core->event_work );
    return 1;
}


//============================================================================================
//
//	ワープ関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * ワープIDセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSetWarpId( VM_MACHINE * core )
{
    u16 id = VMGetWorkValue(core);
    FIELDSYS_WORK* fsys = core->fsys;
    Situation_SetWarpID(SaveData_GetSituation(fsys->savedata), id);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 自分の性別取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetMySex( VM_MACHINE * core )
{
    MYSTATUS* my		= SaveData_GetMyStatus( GameSystem_GetSaveData(core->fsys) );
    u16* ret_wk			= VMGetWork( core );

    *ret_wk = MyStatus_GetMySex( my );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケセン回復処理
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPcKaifuku( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(core->event_work);
    PokeParty_RecoverAll(SaveData_GetTemotiPokemon(fsys->savedata));
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 通信ダイレクトコーナーの終了処理を開始する
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCommDirectEnd( VM_MACHINE * core )
{
    CommFieldStateExitBattle();
    VM_SetWait( core, EvWaitCommDirectEnd );
    return 1;
}

//return 1 = 終了
static BOOL EvWaitCommDirectEnd(VM_MACHINE * core)
{
    if( CommStateIsInitialize() != TRUE ){
        if(CommMPIsInitialize() != TRUE ){
            return 1;
        }
    }
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 終了処理手続き　タイミング同期版
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCommDirectEndTiming( VM_MACHINE * core )
{
    CommFieldStateExitBattleTiming();
    VM_SetWait( core, EvWaitCommDirectEnd );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ダイレクトコーナールームに入った時の処理
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCommDirectEnterBtlRoom( VM_MACHINE * core )
{
    CommFieldStateEnterBattleRoom( core->fsys );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 通信した上でプレイヤーの方向を変更
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCommPlayerSetDir( VM_MACHINE * core )
{
    CommPlayerSetDir( VMGetU16(core) );
    return 0;
}


//--------------------------------------------------------------------------------------------
/**
 * @brief	指定ポケットになにかはいっているかをチェック
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPocketCheck(VM_MACHINE * core)
{
    u16 pocket_id = VMGetWorkValue(core);
    u16 * ret_wk = VMGetWork(core);
    *ret_wk = MyItem_CheckItemPocket(SaveData_GetMyItem(core->fsys->savedata), pocket_id);
    return 0;
}


//============================================================================================
//
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * SXYデータの座標情報を変更
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSxyPosChange( VM_MACHINE * core )
{
    u16 id = VMGetWorkValue(core);
    u16 gx = VMGetWorkValue(core);
    u16 gz = VMGetWorkValue(core);

    EventData_NpcDataPosChange( core->fsys, id, gx, gz );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * OBJデータの座標情報を変更
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjPosChange( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;
    u16 obj_id	= VMGetWorkValue(core);
    u16 x		= VMGetWorkValue(core);
    u16 y		= VMGetWorkValue(core);
    u16 z		= VMGetWorkValue(core);
    u16 dir		= VMGetWorkValue(core);

    //対象のフィールドOBJのポインタ取得
    fldobj	= FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, obj_id );

    FieldOBJ_GPosDirInit( fldobj, x, y, z, dir );

    //高さ即反映
    FieldOBJ_VecPosNowHeightGetSet( fldobj );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * SXYデータの動作コードを変更
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSxyMoveCodeChange( VM_MACHINE * core )
{
    u16 id	= VMGetWorkValue(core);
    u16 mv	= VMGetWorkValue(core);

    EventData_NpcDataMoveCodeChange( core->fsys, id, mv );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * SXYデータの方向を変更
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSxyDirChange( VM_MACHINE * core )
{
    u16 id	= VMGetWorkValue(core);
    u16 dir	= VMGetWorkValue(core);

    EventData_NpcDataDirChange( core->fsys, id, dir );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * SXYデータの接続データの座標を変更
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSxyExitPosChange( VM_MACHINE * core )
{
    u16 id		= VMGetWorkValue(core);
    u16 x		= VMGetWorkValue(core);
    u16 z		= VMGetWorkValue(core);

    EventData_ConnectDataPosChange( core->fsys, id, x, z );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * SXYデータのBGデータの座標を変更
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSxyBgPosChange( VM_MACHINE * core )
{
    u16 id		= VMGetWorkValue(core);
    u16 x		= VMGetWorkValue(core);
    u16 z		= VMGetWorkValue(core);

    OS_Printf( "id = %d\n", id );
    OS_Printf( "x = %d\n", x );
    OS_Printf( "z = %d\n", z );

    EventData_BgDataPosChange( core->fsys, id, x, z );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * OBJの方向を変更
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjDirChange( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;
    u16 obj_id	= VMGetWorkValue(core);
    u16 dir		= VMGetWorkValue(core);

    //対象のフィールドOBJのポインタ取得
    fldobj	= FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, obj_id );
    if( fldobj == NULL ){
        GF_ASSERT( (0) && "対象のフィールドOBJのポインタ取得失敗！" );
    }

    //FieldOBJ_DirDispCheckSet( fldobj, dir );
    FieldOBJ_DirDispDrawSet( fldobj, dir );
    return 0;
};

//--------------------------------------------------------------------------------------------
/**
 * スクリプト結果を代入するワークに値をセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdReturnScriptWkSet( VM_MACHINE * core )
{
    u16** return_script_wk	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_RETURN_SCRIPT_WK );
    u16 num					= VMGetWorkValue(core);

    if( *return_script_wk != NULL ){
        **return_script_wk = num;
    }
    return 0;
}


//--------------------------------------------------------------------------------------------
//

//============================================================================================
//
//	ドアアニメ関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * ドアアニメーションセットアップ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSetUpDoorAnime( VM_MACHINE * core )
{
    u16 block_x,block_z;
    u16 local_x,local_z;
    int grid_x,grid_z;
    u8 entry;

    FIELDSYS_WORK* fsys;

    //ブロック座標を取得
    block_x = VMGetU16(core);
    block_z = VMGetU16(core);
    //ローカルグリッド座標を取得
    local_x = VMGetWorkValue(core);
    local_z = VMGetWorkValue(core);
    //エントリーID取得
    entry = VMGetU8(core);

    OS_Printf("info:%d,%d,%d,%d,%d\n",block_x,block_z,local_x,local_z,entry);

    fsys = core->fsys;

    //ワールド座標を計算
    grid_x = block_x*32+local_x;
    grid_z = block_z*32+local_z;

    //指定座標のモデルのアニメーションセットアップ
    FLD_SCR_ANM_DOOR_Setup(fsys, grid_x, grid_z, entry);

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * アニメーションウェイト
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWait3DAnime( VM_MACHINE * core )
{
    u8 entry;
    FIELDSYS_WORK* fsys;
    //エントリーID取得
    entry = VMGetU8(core);
    fsys = core->fsys;

    FLD_SCR_ANM_DOOR_WaitAnime(fsys, entry);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * アニメーション解放
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFree3DAnime( VM_MACHINE * core )
{
    u8 entry;
    FIELDSYS_WORK* fsys;
    //エントリーID取得
    entry = VMGetU8(core);
    fsys = core->fsys;
    FLD_SCR_ANM_DOOR_FreeDoor(fsys, entry);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ドアオープンアニメ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdOpenDoor( VM_MACHINE * core )
{
    u8 entry;
    FIELDSYS_WORK* fsys;
    //エントリーID取得
    entry = VMGetU8(core);
    fsys = core->fsys;
    FLD_SCR_ANM_DOOR_StartOpenDoorAnm( fsys, entry );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ドアクローズアニメ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCloseDoor( VM_MACHINE * core )
{
    u8 entry;
    FIELDSYS_WORK* fsys;
    //エントリーID取得
    entry = VMGetU8(core);
    fsys = core->fsys;
    FLD_SCR_ANM_DOOR_StartCloseDoorAnm( fsys, entry );
    return 0;
}

//============================================================================================
//
//	ジム関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * ゴーストジム初期状態セット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdInitGhostGym( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    GYM_InitGhostGym(fsys);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 *
 * @brief   ゴーストジムスポットライトタスクセット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSetGhostGymLightTask( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys = core->fsys;
	//ギミックワークを見る
	{
		int id;
		GIMMICKWORK *work;
		//ギミックワーク取得
		work = SaveData_GetGimmickWork(GameSystem_GetSaveData(fsys));
		//ギミックコードを取得
		id = GIMMICKWORK_GetAssignID(work);
		if (id != FLD_GIMMICK_GHOST_GYM){
			return 0;					//ゴーストジムギミック無し
		}
	}
	GYM_SetLightMoveTask(fsys);
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 *
 * @brief   ゴーストジムスポットライトタスク削除
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdDelGhostGymLightTask( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys = core->fsys;
	//ギミックワークを見る
	{
		int id;
		GIMMICKWORK *work;
		//ギミックワーク取得
		work = SaveData_GetGimmickWork(GameSystem_GetSaveData(fsys));
		//ギミックコードを取得
		id = GIMMICKWORK_GetAssignID(work);
		if (id != FLD_GIMMICK_GHOST_GYM){
			return 0;					//ゴーストジムギミック無し
		}
	}
	GYM_DelLightMoveTask(fsys);
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 *
 * @brief   ゴーストジムスポットライト消すイベントセット
 * イベントコールするので、1を返す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdVanishGhostGymLight( VM_MACHINE * core )
{
	int id;
	FIELDSYS_WORK* fsys = core->fsys;
	u8 code = VMGetU8(core);

	//ギミックワークを見る
	{
		int id;
		GIMMICKWORK *work;
		//ギミックワーク取得
		work = SaveData_GetGimmickWork(GameSystem_GetSaveData(fsys));
		//ギミックコードを取得
		id = GIMMICKWORK_GetAssignID(work);
		if (id != FLD_GIMMICK_GHOST_GYM){
			return 1;					//ゴーストジムギミック無し
		}
	}

	if (code){
		id = ID_EVSCR_TARGET_OBJ;	//話しかけ
	}else{
		id = ID_EVSCR_TR0_FLDOBJ;	//視線
	}

	GYM_SetVanishLightEvt(fsys, id);
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 格闘ジム初期状態セット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdInitCombatGym( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    GYM_InitCombatGym(fsys);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 格闘ジムギミック発動
 *
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdMoveCombatGymFall( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
	u16* ret_val = GetEventWorkAdrs(core->fsys,VMGetU16(core));
    *ret_val = GYM_CheckCombatGymEvt(fsys);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 電気ジム初期状態セット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdInitElecGym( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    GYM_InitElecGym(fsys);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 電気ジムゴミ箱スイッチ
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPushElecGymSwitch( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u8 dust_box = VMGetU8(core);
	u8 switch_st = VMGetU8(core);

	GYM_SetElecRock(fsys, dust_box, switch_st);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 電気ジムゴミ箱スイッチチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCheckElecGymSwitch( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u8 dust_box = VMGetU8(core);
	u16* ret_wk	= VMGetWork( core );

	*ret_wk = GYM_CheckElecSwitch(fsys, dust_box);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 電気ジムゴミ箱スイッチチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdEntryElecGymSwitch( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
	GYM_EntryElecGymSwitch(fsys);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 飛行ジム初期状態セット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdInitSkyGym( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    GYM_InitSkyGym(fsys);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 飛行ジムリフト
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdMoveSkyGymLift( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    GYM_MoveSkyGymLift(fsys);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 虫ジム初期状態セット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdInitInsectGym( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    GYM_InitInsectGym(fsys);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 虫ジムリフト
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdMoveInsectGymLift( VM_MACHINE * core )
{
	u8 pos;
    FIELDSYS_WORK* fsys = core->fsys;
	pos = VMGetU8(core);
    GYM_MoveInsectGymLift(fsys, pos);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 虫ジムレバー
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdMoveInsectGymLever( VM_MACHINE * core )
{
	u8 no;
    FIELDSYS_WORK* fsys = core->fsys;
	no = VMGetU8(core);
    GYM_MoveInsectGymLever(fsys, no);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ドラゴンジム初期状態セット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdInitDragonGym( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    GYM_InitDragonGym(fsys);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 毒ジム初期状態セット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdInitPoisonGym( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    GYM_InitPoisonGym(fsys);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 万能ジム初期状態セット
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdInitAlmGym( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    GYM_InitAlmGym(fsys);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 主人公の位置情報取得　全て
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPlayerPosAllGet( VM_MACHINE * core )
{
	u16 *x, *z, *y;
	FIELDSYS_WORK* fsys = core->fsys;

	x = VMGetWork( core );
	y = VMGetWork( core );
	z = VMGetWork( core );

	{
		FIELD_OBJ_PTR fldobj = Player_FieldOBJGet( fsys->player );
		*x = FieldOBJ_NowPosGX_Get( fldobj );
		*y = H_GRID_G_GRID( FieldOBJ_NowPosGY_Get(fldobj) );
		*z = FieldOBJ_NowPosGZ_Get( fldobj );
	}

	return 0;
}

//============================================================================================
/**
 * @brief	タマゴうまれるデモ
 */
//============================================================================================
static BOOL EvCmdTamagoDemo( VM_MACHINE * core )
{
    Field_EggDemo_Call(core->fsys);
    return 1;
}

//-------------------------------------------------------------------------
//	ＯＢＪの見える・見えないスイッチ切り替え
//-------------------------------------------------------------------------
static BOOL EvCmdObjVisible( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;		//対象のフィールドOBJのポインタ
    FIELDSYS_WORK * fsys = core->fsys;

    fldobj	= FieldOBJSys_OBJIDSearch( fsys->fldobjsys, VMGetWorkValue(core) );
    if( fldobj == NULL ){
        GF_ASSERT( (0) && "対象のフィールドOBJのポインタ取得失敗！" );
    }
    FieldOBJ_StatusBitSet_Vanish(fldobj, FALSE);
    return 0;
}

static BOOL EvCmdObjInvisible( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;		//対象のフィールドOBJのポインタ
    FIELDSYS_WORK * fsys = core->fsys;

    fldobj	= FieldOBJSys_OBJIDSearch( fsys->fldobjsys, VMGetWorkValue(core) );
    if( fldobj == NULL ){
        GF_ASSERT( (0) && "対象のフィールドOBJのポインタ取得失敗！" );
    }
    FieldOBJ_StatusBitSet_Vanish(fldobj, TRUE);
    return 0;
}

//メールボックス
//--------------------------------------------------------------------------------------------
/**
 * メールボックス呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
/*
#include "savedata/mail_util.h"
#include "field/fld_mailbox.h"
static BOOL EvCmdMailBox( VM_MACHINE * core )
{
    EventCmd_MailBoxCall(core->event_work);
    return 1;
}
*/
static BOOL EvCmdMailBox( VM_MACHINE * core )
{
    void** buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

	*buf = FieldMailBox_SetProc( core->fsys, HEAPID_WORLD );
    VM_SetWait( core, EvWaitSubProcAndFree );
    return 1;
}


//--------------------------------------------------------------------------------------------
/**
 * メールボックス内のデータ数を取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetMailBoxDataNum( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk			= VMGetWork( core );
    MAIL_BLOCK* block = SaveData_GetMailBlock(fsys->savedata);

    *ret_wk = (u16)MAIL_GetEnableDataNum(block,MAILBLOCK_PASOCOM);
    return 0;
}

//ギネスホールランキング
//--------------------------------------------------------------------------------------------
/**
 * ランキング画面呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdRankingView( VM_MACHINE * core )
{
    u16	mode = VMGetWorkValue(core);
	u16	block = VMGetWorkValue(core);
///    EventCmd_RankingViewCall(core->event_work,mode);

	GuinnessCall_SetupEvent(core->fsys, mode, block);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 時間帯の取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetTimeZone( VM_MACHINE * core )
{
    u16* ret_wk	= VMGetWork( core );
    *ret_wk		= EVTIME_GetTimeZone( core->fsys );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 乱数の取得		※gf_srandを外しましたのでNextと中身は同じです。
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetRand( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk			= VMGetWork( core );
    u16	limit			= VMGetWorkValue( core );

    *ret_wk = ( gf_rand() % limit );
    //OS_Printf("GET_RND[%d] limit[%d]\n",*ret_wk,limit);

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 乱数の取得 GET_RANDのタネを流用したまま呼びたいとき
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetRandNext( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk			= VMGetWork( core );
    u16	limit			= VMGetWorkValue( core );

    *ret_wk = ( gf_rand() % limit );

    return 1;
}

//============================================================================================
//
//	イメージクリップアイテム関連
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * イメージクリップ：アクセサリー：アイテムを加える
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdImcAcceAddItem(VM_MACHINE * core)
{
    IMC_SAVEDATA* imc;
    IMC_ITEM_SAVEDATA* imc_item;
    u16 acce_no	= VMGetWorkValue(core);
    u16 num		= VMGetWorkValue(core);

    imc	= SaveData_GetImcSaveData( core->fsys->savedata );
    imc_item = ImcSaveData_GetItemSaveData( imc );	//アイテムセーブデータ取得

    ImcSaveData_AddAcceFlag( imc_item, acce_no, num );
    return 0;
};

//--------------------------------------------------------------------------------------------
/**
 * イメージクリップ：アクセサリー：アイテムを加えられるかチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdImcAcceAddItemChk(VM_MACHINE * core)
{
    IMC_SAVEDATA* imc;
    IMC_ITEM_SAVEDATA* imc_item;
    u16 acce_no	= VMGetWorkValue(core);
    u16 num		= VMGetWorkValue(core);
    u16* ret_wk	= VMGetWork( core );

    imc	= SaveData_GetImcSaveData( core->fsys->savedata );
    imc_item = ImcSaveData_GetItemSaveData( imc );	//アイテムセーブデータ取得

    *ret_wk = ImcSaveData_CheckAcceAdd( imc_item, acce_no, num );
    return 0;
};

//--------------------------------------------------------------------------------------------
/**
 * イメージクリップ：アクセサリー：バッグのアイテムチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdImcAcceCheckItem(VM_MACHINE * core)
{
    IMC_SAVEDATA* imc;
    IMC_ITEM_SAVEDATA* imc_item;
    u16 acce_no	= VMGetWorkValue(core);
    u16 num		= VMGetWorkValue(core);
    u16* ret_wk	= VMGetWork( core );

    imc	= SaveData_GetImcSaveData( core->fsys->savedata );
    imc_item = ImcSaveData_GetItemSaveData( imc );	//アイテムセーブデータ取得

    if( num <= ImcSaveData_GetAcceFlag(imc_item, acce_no) ){
        *ret_wk = 1;
    }else{
        *ret_wk = 0;
    }

    return 0;
};

//--------------------------------------------------------------------------------------------
/**
 * イメージクリップ：背景：アイテムを加える
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdImcBgAddItem(VM_MACHINE * core)
{
    IMC_SAVEDATA* imc;
    IMC_ITEM_SAVEDATA* imc_item;
    u16 bg_no	= VMGetWorkValue(core);

    imc	= SaveData_GetImcSaveData( core->fsys->savedata );
    imc_item = ImcSaveData_GetItemSaveData( imc );	//アイテムセーブデータ取得

    ImcSaveData_SetBGFlag( imc_item, bg_no );
    return 0;
};

//--------------------------------------------------------------------------------------------
/**
 * イメージクリップ：背景：バッグのアイテムチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdImcBgCheckItem(VM_MACHINE * core)
{
    IMC_SAVEDATA* imc;
    IMC_ITEM_SAVEDATA* imc_item;
    u16 bg_no	= VMGetWorkValue(core);
    u16* ret_wk	= VMGetWork( core );

    imc	= SaveData_GetImcSaveData( core->fsys->savedata );
    imc_item = ImcSaveData_GetItemSaveData( imc );	//アイテムセーブデータ取得

    *ret_wk = ImcSaveData_CheckBgGet( imc_item, bg_no );
    return 0;
};

//--------------------------------------------------------------------------------------------
/**
 * 表彰状イベント：ジョウト図鑑チェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdZukanChkJohto(VM_MACHINE * core)
{
    const ZUKAN_WORK* zw = SaveData_GetZukanWork( core->fsys->savedata );
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = 0;
    if(ZukanWork_CheckJohtoComp(zw) == TRUE){
        *ret_wk = 1;
    }
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 表彰状イベント：全国図鑑チェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdZukanChkNational(VM_MACHINE * core)
{
    const ZUKAN_WORK* zw = SaveData_GetZukanWork( core->fsys->savedata );
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = 0;
    if(ZukanWork_CheckZenkokuComp(zw) == TRUE){
        *ret_wk = 1;
    }
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 表彰状イベント
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdZukanRecongnize(VM_MACHINE * core)
{
    void** buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    u16 idx	= VMGetWorkValue( core );

    *buf = Syoujyou_SetProc(core->fsys, HEAPID_EVENT, idx);
    VM_SetWait( core, EvWaitSubProcAndFree );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 *	紙飛行機の落とす場所を決める
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPaperplaneSet(VM_MACHINE * core)
{
    u16* ret_wk	= VMGetWork( core );


    //060709仕様が無くなった為不用に

    return 0;
}

//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
/**
 *	@brief	レコードデータのインクリメント
 */
static BOOL EvCmdRecordInc(VM_MACHINE* core)
{
    u16 recid = VMGetU16(core);

    RECORD_Inc(SaveData_GetRecord(core->fsys->savedata),recid);
    return 0;
}

/**
 *	@brief	レコードデータを取得する
 */
static BOOL EvCmdRecordGet(VM_MACHINE* core)
{
    u32	val;
    u16	*h_wk,*l_wk;
    u16	recid = VMGetU16(core);
    u16	hwk_id = VMGetU16(core);	//上位
    u16	lwk_id = VMGetU16(core);	//下位

    h_wk = GetEventWorkAdrs(core->fsys,hwk_id);
    l_wk = GetEventWorkAdrs(core->fsys,lwk_id);

    val = RECORD_Get(SaveData_GetRecord(core->fsys->savedata),recid);

    *h_wk = ((val & 0xFFFF0000) >> 16);
    *l_wk = (val & 0x0000FFFF);
    return 0;
}

/**
 *	@brief	レコードデータをセットする
 */
static BOOL EvCmdRecordSet(VM_MACHINE* core)
{
    u32	val;
    u16	recid = VMGetU16(core);
    u16	val1 = VMGetU16(core);	//上位
    u16	val2 = VMGetU16(core);	//下位
    u8	mode = VMGetU8(core);	//0:Add,1:Set,2:SetIfLarge

    val = (u32)(val1)<<16;
    val |= val2;

    switch(mode){
      case 0:	//Add
        RECORD_Add(SaveData_GetRecord(core->fsys->savedata),recid,val);
        break;
      case 1:	//Set
        RECORD_Set(SaveData_GetRecord(core->fsys->savedata),recid,val);
        break;
      case 2:	//SetIfLarge
        RECORD_SetIfLarge(SaveData_GetRecord(core->fsys->savedata),recid,val);
        break;
    }
    return 0;
}

/**
 *	@brief	レコードデータを追加する ワーク指定あり
 */
static BOOL EvCmdRecordAdd(VM_MACHINE* core)
{
	u16	recid	= VMGetU16(core);
	u16	val		= VMGetWorkValue(core);

	RECORD_Add(SaveData_GetRecord(core->fsys->savedata),recid,val);
	return 0;
}

/**
 *	@brief	レコードデータを追加する ワーク指定なし u32
 */
static BOOL EvCmdRecordAddU32(VM_MACHINE* core)
{
	u16	recid	= VMGetU16(core);
	u32	val		= VMGetU32(core);

	RECORD_Add(SaveData_GetRecord(core->fsys->savedata),recid,val);
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		スクリプトコマンド：サファリ制御
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSafariControl(VM_MACHINE * core)
{
    u16 * ball;
    u16 * step;
    SITUATION * st = SaveData_GetSituation(core->fsys->savedata);
    EVENTWORK* ev = SaveData_GetEventWork(core->fsys->savedata);
//    TV_WORK * tvwk = SaveData_GetTvWork(core->fsys->savedata);
    SAFARI_SAVE * safari_sv = SaveData_GetSafariSave(core->fsys->savedata);
    int flag = VMGetU8(core);
    int layout_id = VMGetU8(core);

    ball = Situation_GetSafariBallCount(st);
    step = Situation_GetSafariStepCount(st);
    switch (flag) {
      case 0:		//開始
        SysFlag_SafariSet(ev);
		SafariSv_SetGameLayoutID(safari_sv,layout_id);
#if 0	//TV_OFF
        TVTOPIC_SafariTemp_Init(tvwk);
#endif
        *ball = 30;
        *step = 0;
        break;

      case 1:		//終了
        SysFlag_SafariReset(ev);
		SafariSv_SetGameLayoutID(safari_sv,SAFARI_LAYOUT_FRIEND);	//一応編集できないように人のにしておく
#if 0	//TV_OFF
        TVTOPIC_Entry_Watch_Safari(core->fsys);
#endif
		{
			u8 delay_ct = SafariSv_GetLayoutLevelUpDelayCount(safari_sv);
			if(delay_ct > 0){
				SafariData_Update(core->fsys->savedata,delay_ct);
				SafariSv_SetLayoutLevelUpDelayCount(safari_sv,0);	//遅延カウンタリセット
			}
		}

        *ball = 0;
        *step = 0;
        break;
    }

    return 0;
}
#if 0
//--------------------------------------------------------------------------------------------
/**
 * クライマックスデモ呼び出し
 */
//--------------------------------------------------------------------------------------------
static BOOL	EvCmdClimaxDemoCall(VM_MACHINE * core)
{
    u8 id = VMGetU8(core);
    u16 *ret_wk = VMGetWork(core);

    *ret_wk = ClimaxDemoCall(core->fsys, id);
    return 1;
}
#endif
//--------------------------------------------------------------------------------------------
/**
 * アサビ灯台　アカリちゃん復活デモ呼び出し
 */
//--------------------------------------------------------------------------------------------
static BOOL	EvCmdToudaiRecoverDemoCall(VM_MACHINE * core)
{
	EventCmd_AsagiToudaiRecoverDemo( core->event_work );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 自機高さ取得有無
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPlayerHeightValid(VM_MACHINE * core)
{
    u8 valid = VMGetU8(core);
    Player_HeightGet_ON_OFF( core->fsys->player, valid );
    return 1;
}

//-----------------------------------------------------------------------------
/**
 *	大量発生開始
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdStartGenerate(VM_MACHINE * core)
{
    EncDataSave_StartGenerate( core->fsys->savedata );

    return 0;
}

//-----------------------------------------------------------------------------
/**
 *	移動ポケモン登録
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdAddMovePoke(VM_MACHINE * core)
{
    u8 poke = VMGetU8( core );
    MP_AddMovePoke(core->fsys->savedata, poke);
    return 0;
}

//============================================================================================
//
//	ゲーム内交換
//
//	ID_EVSCR_PWORK使用！
//
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 交換データ作成
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * @li ID_EVSCR_PWORK使用！
 * @li field_tradeオーバーレイを明示的にロードした状態でないと使えません
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFldTradeAlloc(VM_MACHINE * core)
{
    void** pwork	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );
    u8 tradeno		= VMGetU8(core);

	Overlay_Load( FS_OVERLAY_ID( field_trade ), OVERLAY_LOAD_NOT_SYNCHRONIZE );
    *pwork = FLD_TradeAlloc( HEAPID_WORLD, tradeno );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * くれるポケモンナンバー取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * @li ID_EVSCR_PWORK使用！
 * @li field_tradeオーバーレイを明示的にロードした状態でないと使えません
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFldTradeMonsno(VM_MACHINE * core)
{
    void** pwork	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );
    u16* ret_wk		= VMGetWork( core );

    *ret_wk = FLD_TradeMonsno( (FLD_TRADE_WORK*)*pwork );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * わたすポケモンナンバー取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * @li ID_EVSCR_PWORK使用！
 * @li field_tradeオーバーレイを明示的にロードした状態でないと使えません
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFldTradeChgMonsno(VM_MACHINE * core)
{
    void** pwork	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );
    u16* ret_wk		= VMGetWork( core );

    *ret_wk = FLD_TradeChangeMonsno( (FLD_TRADE_WORK*)*pwork );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * わたすポケモンの性別の取得（金銀では、NPCが欲しいポケモンの性別も指定するので）
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * @li ID_EVSCR_PWORK使用！
 * @li field_tradeオーバーレイを明示的にロードした状態でないと使えません
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFldTradeChgMonsSex(VM_MACHINE * core)
{
    void** pwork	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );
    u16* ret_wk		= VMGetWork( core );

    *ret_wk = FLD_TradeChangeMonsSex( (FLD_TRADE_WORK*)*pwork );
    return 0;
}



//--------------------------------------------------------------------------------------------
/**
 * 交換イベント開始
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 *
 * @li ID_EVSCR_PWORK使用！
 * @li field_tradeオーバーレイを明示的にロードした状態でないと使えません
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFldTradeEvent(VM_MACHINE * core)
{
    void** pwork	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );
    u16 pos			= VMGetWorkValue(core);

    EventCmd_FldTrade( core->event_work, (FLD_TRADE_WORK*)*pwork, pos, HEAPID_WORLD );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * 交換データ削除
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * @li ID_EVSCR_PWORK使用！
 * @li field_tradeオーバーレイを明示的にロードした状態でないと使えません
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFldTradeDel(VM_MACHINE * core)
{
    void** pwork	= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PWORK );

    FLD_TradeDelete( (FLD_TRADE_WORK*)*pwork );

	Overlay_UnloadID( FS_OVERLAY_ID( field_trade ) );
    return 0;
}



//--------------------------------------------------------------------------------------------
/**
 * 預かりポケモン手持ち追加
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 * @li field_tradeオーバーレイを明示的にロードした状態でないと使えません
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFldKeepPokeAdd(VM_MACHINE * core)
{
    u8 tradeno		= VMGetU8(core);
    u8 level		= VMGetU8(core);
    u16 zone		= VMGetU16(core);

	Overlay_Load( FS_OVERLAY_ID( field_trade ), OVERLAY_LOAD_NOT_SYNCHRONIZE );

	FLD_KeepPokemonAdd( core->fsys, tradeno , level, zone );

	Overlay_UnloadID( FS_OVERLAY_ID( field_trade ) );

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 預かりポケモン　返却エラーチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 * @li field_tradeオーバーレイを明示的にロードした状態でないと使えません
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFldKeepPokeReturnCheck(VM_MACHINE * core)
{
    u8 trade_no		= VMGetU8(core);
    u8 pos			= VMGetWorkValue(core);
    u16* ret_wk		= VMGetWork( core );

	Overlay_Load( FS_OVERLAY_ID( field_trade ), OVERLAY_LOAD_NOT_SYNCHRONIZE );
	*ret_wk = FLD_KeepPokemonReturnCheck( core->fsys, trade_no ,pos);
	Overlay_UnloadID( FS_OVERLAY_ID( field_trade ) );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 図鑑外国語バージョン　Masterフラグ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdZukanTextVerUp(VM_MACHINE * core)
{
	// フラグの扱いを変更したため、このコマンドは禁止します 2008/09/10 by nakahiro
//	ZukanWork_SetTextVersionUpMasterFlag( SaveData_GetZukanWork(core->fsys->savedata) );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 図鑑性別表示バージョンアップ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdZukanSexVerUp(VM_MACHINE * core)
{
    ZukanWork_SetGraphicVersionUpFlag( SaveData_GetZukanWork(core->fsys->savedata) );
    return 0;
}



//--------------------------------------------------------------------------------------------
/**
 * 全国図鑑フラグ操作(FLAG_MODE_SET,FLAG_MODE_RESET,FLAG_MODE_GET)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdZenkokuZukanFlag(VM_MACHINE * core)
{
    u8 mode		= VMGetU8( core );
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = FALSE;

    if( mode == FLAG_MODE_SET ){
        ZukanWork_SetZenkokuZukanFlag( SaveData_GetZukanWork(core->fsys->savedata) );
        MyStatus_SetDpZenkokuFlag( SaveData_GetMyStatus(core->fsys->savedata) );
    }else if( mode == FLAG_MODE_GET ){
        *ret_wk = ZukanWork_GetZenkokuZukanFlag( SaveData_GetZukanWork(core->fsys->savedata) );
    }else{
        GF_ASSERT( (0) && "全国図鑑フラグ操作の引数が不正です！" );
    }

    return 0;
}

//-----------------------------------------------------------------------------
/**
 *	努力値を取得
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdChkPrmExp(VM_MACHINE * core)
{
    POKEMON_PARAM * pp;
    u16* ret_wk	= VMGetWork( core );
    u16		tno	= VMGetWorkValue(core);
    u32	tmp[7];

    pp = PokeParty_GetMemberPointer( SaveData_GetTemotiPokemon(core->fsys->savedata), tno);

    tmp[0] = PokeParaGet( pp, ID_PARA_hp_exp, NULL );
    tmp[1] = PokeParaGet( pp, ID_PARA_pow_exp, NULL );
    tmp[2] = PokeParaGet( pp, ID_PARA_def_exp, NULL );
    tmp[3] = PokeParaGet( pp, ID_PARA_agi_exp, NULL );
    tmp[4] = PokeParaGet( pp, ID_PARA_spepow_exp, NULL );
    tmp[5] = PokeParaGet( pp, ID_PARA_spedef_exp, NULL );
    *ret_wk = (tmp[0]+tmp[1]+tmp[2]+tmp[3]+tmp[4]+tmp[5]);

    return 0;
}

//-----------------------------------------------------------------------------
/**
 *	曜日チェック
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdChkWeek(VM_MACHINE * core)
{
    RTCDate now_date;
    u16* ret_wk	= VMGetWork( core );

    GF_RTC_GetDate(&now_date);

    *ret_wk = now_date.week;

    return 0;
}

//-----------------------------------------------------------------------------
/**
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdCollectNews(VM_MACHINE * core)
{
    return 0;
}

//-----------------------------------------------------------------------------
/**
 * レギュレーションルールブック
 *
 * @return	"1"
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdRegulationListCall(VM_MACHINE * core)
{
    u16 wk_id = VMGetU16( core );
    EventCmd_RegulationListCall( core->event_work, GetEventWorkAdrs(core->fsys,wk_id) );
    return 1;
}

//-----------------------------------------------------------------------------
/**
 *	ポケモンの回復マシーンアニメ
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdPcRecoverAnm(VM_MACHINE * core)
{
    u16	ball_num = VMGetWorkValue(core);

    PcRecoverAnm_StartAnm(core->fsys, ball_num);

    return 1;
}

//-----------------------------------------------------------------------------
/**
 *	エレベーターアニメ
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdElevatorAnm(VM_MACHINE * core)
{
    u16	dir = VMGetWorkValue( core );
    u16	loop = VMGetWorkValue( core );

    ElevatorAnm_StartAnm(core->fsys, (u8)dir, (u8)loop);

    return 1;
}

//-----------------------------------------------------------------------------
/**
 *	バージョン取得
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdPMVersionGet(VM_MACHINE * core)
{
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = PM_VERSION;
    return 0;
}

//-----------------------------------------------------------------------------
/**
 *	あいことばに該当する壁紙を有効に
 *	OUT *ret_wk  : 0xff:一致しない 0:既にある 1〜8:有効になった壁紙番号
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdAikotobaKabegamiSet(VM_MACHINE * core)
{
    FIELDSYS_WORK * fsys	= core->fsys;
    MYSTATUS* my	= SaveData_GetMyStatus( GameSystem_GetSaveData(core->fsys) );
    u16* ret_wk				= VMGetWork( core );
    BOX_DATA* boxDat = SaveData_GetBoxData( fsys->savedata );
    u16 aik1		= VMGetWorkValue(core);
    u16 aik2		= VMGetWorkValue(core);
    u16 aik3		= VMGetWorkValue(core);
    u16 aik4		= VMGetWorkValue(core);
    int kabe_no;

	kabe_no = BOXPWD_HitCheck( my, aik1, aik2, aik3, aik4, HEAPID_FIELD );

    if((kabe_no == BOXPWD_RESULT_ERROR)||(kabe_no > 7)){
        *ret_wk = 0xff;			//あいことばが一致しない
        return 0;
    }

    if(BOXDAT_GetDaisukiKabegamiFlag( boxDat, kabe_no)){
        *ret_wk = 0;		//既に登録済み
    }else{
        BOXDAT_SetDaisukiKabegamiFlag( boxDat, kabe_no );
        *ret_wk = kabe_no+1;
    }

    return 0;
}

//-----------------------------------------------------------------------------
/**
 *	あいことばに該当するタマゴナンバーを返す
 *	OUT *ret_wk  : 0xff:一致しない 8〜10:タマゴ番号
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdGetAikotobaEgg(VM_MACHINE * core)
{
    FIELDSYS_WORK * fsys	= core->fsys;
    MYSTATUS* my	= SaveData_GetMyStatus( GameSystem_GetSaveData(core->fsys) );
    u16* ret_wk				= VMGetWork( core );
    BOX_DATA* boxDat = SaveData_GetBoxData( fsys->savedata );
    u16 aik1		= VMGetWorkValue(core);
    u16 aik2		= VMGetWorkValue(core);
    u16 aik3		= VMGetWorkValue(core);
    u16 aik4		= VMGetWorkValue(core);
    int egg_no;

	egg_no = EGGPWD_HitCheck( my, aik1, aik2, aik3, aik4, HEAPID_FIELD );

	if (egg_no == EGGPWD_RESULT_ERROR){
		*ret_wk = 0xff;			//あいことばが一致しない
        return 0;;
	}

	*ret_wk = egg_no;

    return 0;
}


//--------------------------------------------------------------------------------------------
/**
 * パソコンアニメーションセットアップ
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSetUpPasoAnime( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys;
    u8 entry;
    fsys = core->fsys;
    //エントリーID取得
    entry = VMGetU8(core);

    //パソコンアニメーションセットアップ
    FLD_SCR_ANM_PASO_Setup(fsys, entry);

    return 0;
}

//-----------------------------------------------------------------------------
/**
 *	パソコンつける
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdStartPasoOnAnime(VM_MACHINE * core)
{
    FIELDSYS_WORK* fsys;
    u8 entry;
    fsys = core->fsys;
    //エントリーID取得
    entry = VMGetU8(core);
    FLD_SCR_ANM_PASO_PasoOnAnm(	fsys, entry );
    return 0;
}

//-----------------------------------------------------------------------------
/**
 *	パソコン消す
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdStartPasoOffAnime(VM_MACHINE * core)
{
    FIELDSYS_WORK* fsys;
    u8 entry;
    fsys = core->fsys;
    //エントリーID取得
    entry = VMGetU8(core);
    FLD_SCR_ANM_PASO_PasoOffAnm( fsys, entry );
    return 0;
}



//============================================================================================
//============================================================================================
//
//--------------------------------------------------------------------------------------------
/**
 * 図鑑見たフラグをセット
 *
 * @param	monsno	ポケモンナンバー
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static void Scr_ZukanSeeSet( FIELDSYS_WORK* fsys, u16 monsno )
{
    ZUKAN_WORK * zw				= SaveData_GetZukanWork( fsys->savedata );
    POKEMON_PARAM* poke_param	= PokemonParam_AllocWork( HEAPID_EVENT );

    PokeParaInit( poke_param );
    PokeParaSet( poke_param, monsno, 50, POW_RND, RND_NO_SET, 0, ID_NO_SET, 0 );
    ZukanWork_SetPokeSee( zw, poke_param );
    sys_FreeMemoryEz( poke_param );
    return;
}

//-----------------------------------------------------------------------------
/**
 * @brief	図鑑を見た状態にする
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdZukanSeeSet(VM_MACHINE * core)
{
	u16	monsno = VMGetWorkValue(core);
	Scr_ZukanSeeSet( core->fsys, monsno );
	return 0;
}


//============================================================================================
//============================================================================================
//-----------------------------------------------------------------------------
/**
 * @brief	ポケモンボックスの空きを数える
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdPokeBoxCountEmptySpace(VM_MACHINE * core)
{
    u16 * ret_wk = VMGetWork(core);
    u16 count;
    count = BOXDAT_GetEmptySpaceTotal( SaveData_GetBoxData(core->fsys->savedata) );
	*ret_wk = count;
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * レポート描画処理追加(自機形態が徒歩以外であれば何もしない)
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 *
 * @li ID_EVSCR_PWORK使用！
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdReportDrawProcSet( VM_MACHINE * core )
{
    TCB_PTR* tcb = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PLAYER_TCB );

    *tcb = NULL;
    *tcb = Player_ReportDrawProcSet( core->fsys );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * レポート描画処理削除
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 *
 * @li ID_EVSCR_PWORK使用！
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdReportDrawProcDel( VM_MACHINE * core )
{
    TCB_PTR* tcb = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_PLAYER_TCB );
    Player_ReportDrawProcDelete( *tcb );
    return 1;
}

//-----------------------------------------------------------------------------
/**
 *	殿堂マシーン上ボールアニメ
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdDendouBallAnm(VM_MACHINE * core)
{
    u16	ball_num = VMGetWorkValue(core);

    DendouBallAnm_StartAnm(core->fsys, ball_num);
    return 1;
}

//-----------------------------------------------------------------------------
/**
 *	スコアの加算
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdAddScore(VM_MACHINE * core)
{
    u16	score_id = VMGetU16(core);

    RECORD_Score_Add(SaveData_GetRecord(core->fsys->savedata), score_id);
    return 0;
}

//----------------------------------------------------------------------------
/**
 *	@brief	指定のポケモンがパーティ内にいるかチェック
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdPartyMonsNoCheck(VM_MACHINE * core)
{
    u16	monsno = VMGetWorkValue(core);
    u16* ret_wk			= VMGetWork( core );
    POKEPARTY* p_party = SaveData_GetTemotiPokemon( core->fsys->savedata );
    *ret_wk = PokeParty_PokemonCheck( p_party, monsno );
    return 1;
}

//----------------------------------------------------------------------------
/**
 *	@brief	パーティ内のデオキシスのフォルムを変更
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdPartyDeokisisuFormChange(VM_MACHINE * core)
{
    u16 form = VMGetWorkValue(core);
    POKEPARTY* p_party = SaveData_GetTemotiPokemon( core->fsys->savedata );
    int i;
    int monsno;
    int poke_count = PokeParty_GetPokeCount( p_party );
    POKEMON_PARAM* p_pp;
    ZUKAN_WORK* zw = SaveData_GetZukanWork( core->fsys->savedata );

    for( i=0; i<poke_count; i++ ){
        // ポケモンパーティ　ないのデオキシスチェック
        p_pp = PokeParty_GetMemberPointer( p_party, i );
        monsno = PokeParaGet( p_pp, ID_PARA_monsno, NULL );

        if( monsno == MONSNO_DEOKISISU ){

            // フォルム設定し、
            // パラメータの再計算	攻撃力とか
            PokeParaPut( p_pp, ID_PARA_form_no, &form );
            PokeParaCalc( p_pp );

            // 図鑑に登録
            ZukanWork_SetPokeGet( zw, p_pp );
        }
    }

    return 1;
}

//----------------------------------------------------------------------------
/**
 *	@brief	ミノムッチ3種類ポケパーティにそろっているかチェック
 *
 *	@param	core
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdCheckMinomuchiComp( VM_MACHINE * core )
{
    u16* ret_wk			= VMGetWork( core );
    POKEPARTY* p_party = SaveData_GetTemotiPokemon( core->fsys->savedata );
    int i,j;
    int monsno;
    BOOL check_result;
    int poke_count = PokeParty_GetPokeCount( p_party );
    POKEMON_PARAM* p_pp;
    int form_arry[ TEMOTI_POKEMAX ] = { 0x7ffffff,0x7ffffff,0x7ffffff,0x7ffffff,0x7ffffff,0x7ffffff };	// ありえない数字で初期化しておく
    int form;
    int form_count;

    form_count = 0;
    for( i=0; i<poke_count; i++ ){
        // ポケモンパーティ　ないのミノムッチチェック
        p_pp = PokeParty_GetMemberPointer( p_party, i );
        monsno = PokeParaGet( p_pp, ID_PARA_monsno, NULL );
        form = PokeParaGet( p_pp, ID_PARA_form_no, NULL );

        if( monsno == MONSNO_MINOMUTTI ){
            form_arry[ i ] = form;

            // 以前に自分と同じナンバーがない場合カウント
            check_result = FALSE;
            for( j=0; j<i; j++ ){

                // おんなじならフラグをTRUEに
                if( form_arry[ j ] == form ){
                    check_result = TRUE;
                }
            }

            if( check_result == FALSE ){
                form_count ++;
            }
        }
    }

    *ret_wk = form_count;

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケッチをフックする
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * FLAG_CHANGE_LABELの時など、フィールドマップがない状態で使用しないと不具合が出ます。
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPoketchHookSet( VM_MACHINE * core )
{
    EVENTWORK* ev = SaveData_GetEventWork( core->fsys->savedata );

    SysFlag_PoketchHookSet(ev);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケッチのフックを解除する
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * FLAG_CHANGE_LABELの時など、フィールドマップがない状態で使用しないと不具合が出ます。
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPoketchHookReset( VM_MACHINE * core )
{
    EVENTWORK* ev = SaveData_GetEventWork( core->fsys->savedata );

    SysFlag_PoketchHookReset(ev);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 現在の時刻（時間:0-23)
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetNowHour( VM_MACHINE * core )
{
    u16* ret_wk			= VMGetWork( core );

    *ret_wk = EVTIME_GetHour(core->fsys);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 *	@brief	フィールドオブジェを揺らすアニメーションコマンド
 *
 *	@param	objid	フィールドOBJのID
 *	@param	count	u16:揺らす回数
 *	@param	spd		u16:揺らすスピード
 *	@param	ofsx	u16:揺らす幅X
 *	@param	ofsz	u16:揺らす幅Z
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjShakeAnm( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;		//対象のフィールドOBJのポインタ
    u16	objid = VMGetWorkValue(core);
    u16	count = VMGetWorkValue(core);
    u16	spd = VMGetWorkValue(core);
    u16	ofsx = VMGetWorkValue(core);
    u16	ofsz = VMGetWorkValue(core);

    fldobj	= FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys,objid);
    if( fldobj == NULL ){
        GF_ASSERT( (0) && "対象のフィールドOBJのポインタ取得失敗！" );
    }

    EventCmd_ObjShakeAnm(core->event_work,fldobj,count,spd,ofsx,ofsz);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 *	@brief	フィールドオブジェをblinkさせるアニメーションコマンド
 *
 *	@param	objid	フィールドOBJのID
 *	@param	count	u16:on/off回数
 *	@param	time	u16:on/offのインターバル
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjBlinkAnm( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;		//対象のフィールドOBJのポインタ
    u16	objid = VMGetWorkValue(core);
    u16	count = VMGetWorkValue(core);
    u16	time = VMGetWorkValue(core);

    fldobj	= FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys,objid);
    if( fldobj == NULL ){
        GF_ASSERT( (0) && "対象のフィールドOBJのポインタ取得失敗！" );
    }

    EventCmd_ObjBlinkAnm(core->event_work,fldobj,count,time);
    return 1;
}
/**
 *	@brief	レジキングイベント　条件チェック
 */
static BOOL EvCmd_D20R0106Legend_IsUnseal( VM_MACHINE * core )
{
    u16* ret_val = GetEventWorkAdrs(core->fsys,VMGetU16(core));

    *ret_val = EventCheck_IsReziUnseal(core->fsys->savedata);
    return 0;
}

//==============================================================================
//
//	お洒落お姉さん
//
//==============================================================================
///お洒落お姉さんイベント：取得出来るアクセサリの開始番号
#define DRESSING_ACCE_START_NO		(IMC_ACCE_DROP00)
///お洒落お姉さんイベント：取得出来るアクセサリの最終番号
#define DRESSING_ACCE_END_NO		(IMC_ACCE_KIRAKIRA_POWDER00)
///お洒落お姉さんイベント：取得出来るアクセサリの種類数		(END_NOのも含めるので＋１)
#define DRESSING_ACCE_NUM			(DRESSING_ACCE_END_NO - DRESSING_ACCE_START_NO + 1)

//--------------------------------------------------------------------------------------------
/**
 * お洒落お姉さん：ランダムで取得出来るイメージクリップのアクセサリー番号取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * ret_wk = 取得したアクセサリーの番号、　0xffff＝取得出来なかった
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdDressingImcAcceCheck(VM_MACHINE * core)
{
    IMC_SAVEDATA* imc;
    IMC_ITEM_SAVEDATA* imc_item;
    u16 acce_no[DRESSING_ACCE_NUM];
    int i, set_count, get_pos, get_acce;
    u16* ret_wk	= VMGetWork( core );

    imc	= SaveData_GetImcSaveData( core->fsys->savedata );
    imc_item = ImcSaveData_GetItemSaveData( imc );	//アイテムセーブデータ取得

    set_count = 0;
    for(i = 0; i < DRESSING_ACCE_NUM; i++){
        if(ImcSaveData_CheckAcceAdd( imc_item, DRESSING_ACCE_START_NO + i, 1 ) == TRUE){
            acce_no[i] = TRUE;
            set_count++;
        }
    }
    if(set_count == 0){		//全てのアクセサリーが既に取得済み
        *ret_wk = 0xffff;
        return 0;
    }

    get_pos = gf_rand() % set_count;
    for(i = 0; i < DRESSING_ACCE_NUM; i++){
        if(acce_no[i] == TRUE){
            if(get_pos == 0){
                break;
            }
            else{
                get_pos--;
            }
        }
    }
    GF_ASSERT(i < DRESSING_ACCE_NUM);
    get_acce = DRESSING_ACCE_START_NO + i;

    *ret_wk = get_acce;
    return 0;
};


//----------------------------------------------------------------------------
/**
 *	@brief	ささっているAGBカートリッジ取得
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdAgbCartridgeVerGet( VM_MACHINE * core )
{
    u16* ret_wk			= VMGetWork( core );
    *ret_wk = sys.AgbCasetteVersion;
    return 1;
}

//----------------------------------------------------------------------------
/**
 *	@brief	隠しマップフラグon/off
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdHideMapStateChange( VM_MACHINE * core )
{
    u16	hidemap_id	= VMGetWorkValue(core);
    u8	flag	= VMGetU8(core);
    EVENTWORK *ev = SaveData_GetEventWork(core->fsys->savedata);

    if(flag){
        SysWork_HideMapWorkSet(ev, hidemap_id);
    }else{
        SysWork_HideMapWorkClear(ev, hidemap_id);
    }
    return 0;
}


//----------------------------------------------------------------------------
/**
 *	@brief	イメージクリップ「背景名」を文字バッファに設定
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdImcBgNameSet( VM_MACHINE * core )
{

    WORDSET** wordset		= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WORDSET );
    u8 idx		= VMGetU8(core);
    u16	bg_no	= VMGetWorkValue(core);

    WORDSET_RegisterImageClibBgName( *wordset, idx, bg_no );

    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * レベルでアイテム取得オヤジの数字取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLevelJijiiNo(VM_MACHINE * core)
{
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = SysWork_PokeLevelNoGet( SaveData_GetEventWork(core->fsys->savedata) );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * イメージクリップ：アクセサリー：アイテムを減らす
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdImcAcceSubItem(VM_MACHINE * core)
{
    IMC_SAVEDATA* imc;
    IMC_ITEM_SAVEDATA* imc_item;
    u16 acce_no	= VMGetWorkValue(core);
    u16 num		= VMGetWorkValue(core);

    imc	= SaveData_GetImcSaveData( core->fsys->savedata );
    imc_item = ImcSaveData_GetItemSaveData( imc );	//アイテムセーブデータ取得

    ImcSaveData_SubAcceFlag( imc_item, acce_no, num );
    return 0;
};

//--------------------------------------------------------------------------------------------
/**
 * レベルジジイ初期化
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdLevelJijiiInit(VM_MACHINE * core)
{
    FIELDSYS_WORK* fsys = core->fsys;
    SAVEDATA * sv = fsys->savedata;

    SysWorkUpdatePokeLevelNo(sv);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 難解ことばをランダムでひとつ覚えさせる
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * もう全て覚えている場合:0xffff
 * 新規にことばを覚えた場合：単語ID（0 〜 PMSW_NANKAI_WORD_MAX-1）
 * 新規にことばを覚えた場合はさらに、buf_idで指定した箇所に文字列をWORDSETします。
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdNewNankaiWordSet(VM_MACHINE * core)
{
    PMSW_SAVEDATA *pmsw;
    u32 nankai_id;
    u16* ret_wk	= VMGetWork( core );
    u16 buf_id = VMGetWorkValue(core);
    WORDSET** wordset		= GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WORDSET );

    pmsw = SaveData_GetPMSW( core->fsys->savedata );
    nankai_id = PMSW_SetNewNankaiWord( pmsw );

    if(nankai_id == PMSW_NANKAI_WORD_MAX){
        *ret_wk = 0xffff;
        return 0;
    }
    else{
        *ret_wk = nankai_id;
    }

    //難解言葉IDからWORDSETを行う
    {
        PMS_WORD pmsword;

        pmsword = PMSW_NankaiWord_to_PMSWORD(nankai_id);
        WORDSET_RegisterPMSWord( *wordset, buf_id, pmsword);
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 難解ことばを全て覚えているかチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 * もう全て覚えている場合:TRUE, 覚えていないのがある：FALSE
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdNankaiWordCompleteCheck(VM_MACHINE * core)
{
    PMSW_SAVEDATA *pmsw;
    u16* ret_wk	= VMGetWork( core );

    pmsw = SaveData_GetPMSW( core->fsys->savedata );
    if(PMSW_CheckNankaiWordComplete( pmsw ) == TRUE){
        *ret_wk = TRUE;
    }
    else{
        *ret_wk = FALSE;
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 常連チェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdRegularCheck( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    EVENTWORK *ev = SaveData_GetEventWork(core->fsys->savedata);
    u16* ret_wk			= VMGetWork( core );
    u16 rs;

    rs = SysWork_RegularCountGet(ev);

    if(rs >= 5){
        *ret_wk = TRUE;
    }else{
        *ret_wk = FALSE;
    }

    return	0;
}

//--------------------------------------------------------------------------------------------
/**
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdBirthDayCheck(VM_MACHINE * core)
{
    u16 * ret_wk = VMGetWork(core);
    FIELDSYS_WORK * fsys = core->fsys;
    SYSTEMDATA * sysdt;
    sysdt = SaveData_GetSystemData(core->fsys->savedata);

    if (SYSTEMDATA_GetBirthMonth(sysdt) == EVTIME_GetMonth(fsys)
        && SYSTEMDATA_GetBirthDay(sysdt) == EVTIME_GetDay(fsys)) {
        *ret_wk = 1;
    } else {
        *ret_wk = 0;
    }
    return 0;

}


//--------------------------------------------------------------------------------------------
/**
 * アンノーン形状の捕まえた数を取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdAnoonGetNum( VM_MACHINE * core )
{
    const ZUKAN_WORK* zw	= SaveData_GetZukanWork( core->fsys->savedata );
    u16* ret_wk				= VMGetWork( core );

    *ret_wk = ZukanWork_GetPokeAnnoonNum( zw, TRUE );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 *	@brief	配布イベントマジックナンバーチェック
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdIsHaihuEventEnable(VM_MACHINE *core)
{
    u8		id = VMGetU8(core);
    u16*	ret_wk = VMGetWork(core);
    EVENTWORK* ev = SaveData_GetEventWork(core->fsys->savedata);

	GF_ASSERT( (id <= 1) && "SysWork_HaihuEventWorkCheck() id over\n" );

    *ret_wk = SysWork_HaihuEventWorkCheck(ev,id);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 殿堂入り回数を取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdDendouNumGet( VM_MACHINE * core )
{
    LOAD_RESULT result;
    const DENDOU_SAVEDATA* data;
    u16* ret_wk = VMGetWork( core );

    data = SaveData_Extra_LoadDendouData( core->fsys->savedata, HEAPID_EVENT, &result);

    if( result == LOAD_RESULT_NULL ){								///<データなし
        OS_Printf( "でんどうデータ LOAD_RESULT_NULL\n" );
        *ret_wk = 0;
        sys_FreeMemoryEz( (void*)data );
        return 1;

    }else if( result == LOAD_RESULT_OK ){							///<データ正常読み込み
        OS_Printf( "でんどうデータ LOAD_RESULT_OK\n" );
        *ret_wk = DendouData_GetRecordNumber( data, 0 );
        sys_FreeMemoryEz( (void*)data );
        return 1;

    }else if( result == LOAD_RESULT_NG ){							///<データ異常
        OS_Printf( "でんどうデータ LOAD_RESULT_NG\n" );
        *ret_wk = 0;
        sys_FreeMemoryEz( (void*)data );
        return 1;
    }

    *ret_wk = 0;
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	そだてやポケモン選択画面呼び出し
 *
 * @param	core	仮想マシン制御構造体へのポインタ
 *
 * @return	1		スクリプトからメイン制御に戻る
 *
 * @li EvCmdPokeListGetResultで、選択した位置を取得して、ワーク開放が必要
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSodateyaPokeListSetProc(VM_MACHINE * core)
{
    void ** buf;
    u16 pos		= VMGetWorkValue(core);

    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
    *buf = SodateyaPokeListEvent_SetProc(HEAPID_EVENT, core->fsys, pos);

    VM_SetWait( core, EvCmdWaitSubProcEnd );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	そだてやポケモン選択画面呼び出し
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	1		スクリプトからメイン制御に戻る
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSodateyaPokeListGetResult(VM_MACHINE * core)
{
    void ** buf;
    u16 * ret_wk, * ret_mode;

    ret_wk = VMGetWork(core);
    ret_mode = VMGetWork(core);
    buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

    GF_ASSERT(*buf != 0);

    *ret_wk = FieldPokeListEvent_GetSelect(*buf);
    if (*ret_wk == PL_SEL_POS_EXIT) {
        *ret_wk = 0xff;
    }

    *ret_mode = FieldPokeListEvent_GetMode(*buf);
    if (*ret_mode == PL_RET_STATUS) {
        *ret_mode = 1;	//つよさをみる
    }
    else{
        *ret_mode = 0;	//通常
    }

    sys_FreeMemoryEz(*buf);
    *buf = NULL;

    return 0;
}



//--------------------------------------------------------------------------------------------
/**
 *	指定した確立でワークにTRUE,FALSEを返す
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetRandomHit( VM_MACHINE * core )
{
    u16	rnd;
    u8	per = VMGetU8(core);
    u16	*ret_wk  = VMGetWork(core);

    if(per > 100){
        per = 100;
    }
    rnd = gf_rand()%101;
    if(rnd <= per){
        *ret_wk = 1;
    }else{
        *ret_wk = 0;
    }
    return 0;
}

//----------------------------------------------------------------------------
/**
 *	@brief	ヒデンエフェクト　エフェクト開始
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdHidenEffStart(VM_MACHINE * core)
{
    u16	effect_type = VMGetWorkValue(core);
    u16	*ret_wk  = VMGetWork(core);	// 終了検知ワーク
    FIELDSYS_WORK * fsys = core->fsys;

    switch( effect_type ){
    case SCR_HIDENEFF_IAIGIRI:
        ScrCmd_HidenEffContStart( fsys, ret_wk, SCR_HIDENEFF_IAIGIRI, HEAPID_EVENT );
        break;
    case SCR_HIDENEFF_IWAKUDAKI:
        ScrCmd_HidenEffContStart( fsys, ret_wk, SCR_HIDENEFF_IWAKUDAKI, HEAPID_EVENT );
        break;
    case SCR_HIDENEFF_IWAKUDAKI_PAIR:
        ScrCmd_HidenEffContStart( fsys, ret_wk, SCR_HIDENEFF_IWAKUDAKI_PAIR, HEAPID_EVENT );
        break;
    case SCR_HIDENEFF_IAIGIRI_PAIR:
        ScrCmd_HidenEffContStart( fsys, ret_wk, SCR_HIDENEFF_IAIGIRI_PAIR, HEAPID_EVENT );
        break;
	case SCR_FIELDEFF_ZUTUKI:
        ScrCmd_HidenEffContStart( fsys, ret_wk, SCR_FIELDEFF_ZUTUKI, HEAPID_EVENT );
		break;
	case SCR_FIELDEFF_ZUTUKI_PAIR:
        ScrCmd_HidenEffContStart( fsys, ret_wk, SCR_FIELDEFF_ZUTUKI_PAIR, HEAPID_EVENT );
		break;
    default:
        GF_ASSERT(0);
        break;
    }
    return 1;
}

//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------


//--------------------------------------------------------------------------------------------
/**
 * @brief
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	0			スクリプトからメイン制御に戻る
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCheckMyGSID(VM_MACHINE * core)
{
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = mydwc_checkMyGSID( core->fsys->savedata );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	0			スクリプトからメイン制御に戻る
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetFriendDataNum(VM_MACHINE * core)
{
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = WifiList_GetFriendDataNum( SaveData_GetWifiListData(core->fsys->savedata) );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	アウスのプレートのチェック
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdAusuItemCheck(VM_MACHINE * core)
{
    u16 itemno	= VMGetWorkValue(core);
    u16* ret_wk	= VMGetWork( core );

    *ret_wk = 0;

    //「ひのたまプレート」〜「こうてつプレート」
    if( (itemno >= ITEM_HINOTAMAPUREETO) && (itemno <= ITEM_KOUTETUPUREETO) ){
        *ret_wk = 1;
    }

    return 0;
}

//=========================================================================================
//=========================================================================================
#include "msgdata\msg_fushigi_pwd.h"

//-----------------------------------------------------------------------------
/**
 *	あいことばが”おくりものフラグ”に該当するかチェック
 *	OUT *ret_wk  : 1:有効 0:無効
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdAikotobaOkurimonoChk(VM_MACHINE * core)
{
    enum {
        USABLE_HEAPID = HEAPID_EVENT,
    };

    FIELDSYS_WORK * fsys	= core->fsys;
    u16* ret_wk				= VMGetWork( core );
    u16 word0		= VMGetWorkValue(core);
    u16 word1		= VMGetWorkValue(core);
    u16 word2		= VMGetWorkValue(core);
    u16 word3		= VMGetWorkValue(core);

    WORDSET* wordset = WORDSET_Create( USABLE_HEAPID );
    MSGDATA_MANAGER* msgman = MSGMAN_Create( MSGMAN_TYPE_NORMAL, ARC_MSG, NARC_msg_fushigi_pwd_dat, USABLE_HEAPID );
    STRBUF* input_pwd;
    STRBUF* correct_pwd;

    WORDSET_RegisterPMSWord( wordset, 0, word0 );
    WORDSET_RegisterPMSWord( wordset, 1, word1 );
    WORDSET_RegisterPMSWord( wordset, 2, word2 );
    WORDSET_RegisterPMSWord( wordset, 3, word3 );

    input_pwd = MSGDAT_UTIL_AllocExpandString( wordset, msgman, STRID_fushigi_pwd_fmt, USABLE_HEAPID );
    correct_pwd = MSGMAN_AllocString( msgman, STRID_fushigi_pwd );

    *ret_wk = ( STRBUF_Compare( input_pwd, correct_pwd ) == 0 );

    STRBUF_Delete( input_pwd );
    STRBUF_Delete( correct_pwd );
    MSGMAN_Delete( msgman );
    WORDSET_Delete( wordset );

    return 0;
}

//-----------------------------------------------------------------------------
/**
 *	WIFIふしぎなおくりものオープンフラグセット
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdWifiHusiginaokurimonoOpenFlagSet(VM_MACHINE * core)
{
    FIELDSYS_WORK * fsys	= core->fsys;
    SYSTEMDATA * sysdt;
    sysdt = SaveData_GetSystemData(core->fsys->savedata);

    SYSTEMDATA_SetWifiMPOpenFlag(sysdt,1);
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * ユニオンルーム
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdUnionGetCardTalkNo( VM_MACHINE * core )
{
    FIELDSYS_WORK *fsys = core->fsys;
    u16* ret_wk				= VMGetWork( core );

    WORDSET** wordset	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );

    *ret_wk = Union_GetCardTalkNo(*wordset );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 	WirelessIconEasy呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWirelessIconEasy( VM_MACHINE * core )
{
    WirelessIconEasy();
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 	WirelessIconEasyEnd呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdWirelessIconEasyEnd( VM_MACHINE * core )
{
    WirelessIconEasyEnd();
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 主人公の位置を正しく記録するためにフィールド情報をSAVEDATAに反映させる
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSaveFieldObj( VM_MACHINE * core )
{
    Field_SaveFieldObj( core->fsys );
    return 0;
}

//-----------------------------------------------------------------------------
/**
 *	@brief	エスケープロケーションを直接書き換える
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdSetEscapeLocation(VM_MACHINE* core)
{
    u16	zone_id = VMGetWorkValue(core);
    u16	grid_x = VMGetWorkValue(core);
    u16	grid_z = VMGetWorkValue(core);
    SITUATION * sit = SaveData_GetSituation(core->fsys->savedata);
    LOCATION_WORK* loc = Situation_GetEscapeLocation(sit);

    loc->zone_id = zone_id;
    loc->grid_x = grid_x;
    loc->grid_z = grid_z;
    loc->door_id = DOOR_ID_JUMP_CODE;
    loc->dir = DIR_DOWN;
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * OBJ同士の当たり判定フラグを設定
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFieldObjBitSetFellowHit( VM_MACHINE * core )
{
    FIELD_OBJ_PTR fldobj;
    u16	obj_id	= VMGetWorkValue(core);
    u16	flag	= VMGetU8(core);

    //対象のフィールドOBJのポインタ取得
    fldobj = FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, obj_id );

    if( fldobj == NULL ){
        GF_ASSERT( (0) && "指定したIDに該当するデータがありませんでした！" );
    }

    FieldOBJ_StatusBitSet_FellowHit( fldobj, flag );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * トレーナーカードランク取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetCardRank( VM_MACHINE * core )
{
    FIELDSYS_WORK *fsys = core->fsys;
    u16* ret_wk				= VMGetWork( core );

    *ret_wk = TRCSET_GetCardRank(fsys);
    return 0;
}


//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
static BOOL EvCmdReportInfoWinOpen( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = core->fsys;
    REPORT_INFO ** riw = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_REPORTWIN );
    if (!SaveData_IsOverwritingOtherData(fsys->savedata)) {
        *riw = ReportInfo_Create(fsys, HEAPID_FIELD, FLD_MBGFRM_FONT);
        ReportInfo_WriteWindow(*riw);
    }
    return 0;
}


//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
static BOOL EvCmdReportInfoWinClose( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = core->fsys;
    REPORT_INFO ** riw = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_REPORTWIN );
    if (!SaveData_IsOverwritingOtherData(fsys->savedata)) {
        ReportInfo_EraseWindow(*riw);
        ReportInfo_Delete(*riw);
    }
    return 0;
}


//--------------------------------------------------------------------------------------------
/**
 * @brief		スクリプトコマンド：望遠鏡モードセット
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdFieldScopeModeSet( VM_MACHINE * core )
{
    FldFlg_SetPictureMode( core->fsys, VMGetU8(core) );
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		スクリプトコマンド：フロンティアシステムコール
 * @param		core
 */
//--------------------------------------------------------------------------------------------
#include "frontier/frontier_types.h"
#include "frontier/frontier_main.h"
#include "frontier/fss_scene.h"

static BOOL EvCmdFrontierSystemCall( VM_MACHINE * core )
{
	void** buf	= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
	u8 scene	= VMGetU8(core);

	FRONTIER_EX_PARAM* ex_param = sys_AllocMemoryLo( HEAPID_WORLD, sizeof(FRONTIER_EX_PARAM) );
	MI_CpuClear8( ex_param, sizeof(FRONTIER_EX_PARAM) );

	*buf = ex_param;

	//PROCコール
	//ex_param作成

	//バトルタワー
	if( (scene == FSS_SCENEID_TOWER_SINGLE_WAY) ||			//シングル通路
		(scene == FSS_SCENEID_TOWER_MULTI_WAY) ){			//マルチ通路
		ex_param->syswork	= core->fsys->btower_wk;

	//ファクトリー、それ以外
	}else{
		ex_param->syswork	= NULL;
	}

	ex_param->config	= SaveData_GetConfig( core->fsys->savedata );
	ex_param->scene_id	= scene;
	ex_param->savedata	= core->fsys->savedata;
	ex_param->zone_id	= core->fsys->location->zone_id;
	ex_param->bag_cursor= core->fsys->bag_cursor;
	ex_param->battle_cursor = core->fsys->battle_cursor;

	EventCmd_CallSubProc( core->event_work, &FrontierMainProcData, ex_param );

	VM_SetWait( core, EvWaitSubProcAndFree );
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		スクリプトコマンド：フロンティアモニター
 * @param		core
 * @return		"1"
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdFrontierMonitor( VM_MACHINE * core )
{
	void** buf	= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
	u16 type	= VMGetWorkValue(core);
	u16 fr_no	= VMGetWorkValue(core);
	u16 monsno	= VMGetWorkValue(core);

	*buf = FrontierMonitor_SetProc( core->fsys, type, fr_no, monsno, HEAPID_EVENT );

	VM_SetWait( core, EvWaitSubProcAndFree );
	//VM_SetWait( core, EvCmdWaitSubProcEnd );
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		スクリプトコマンド：スクラッチ
 * @param		core
 * @return		"1"
 */
//--------------------------------------------------------------------------------------------
#include "application/scratch.h"
BOOL EvCmdScratch( VM_MACHINE * core )
{
	void** buf	= GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

	*buf = Scratch_SetProc( core->fsys, HEAPID_EVENT );

	//VM_SetWait( core, EvWaitSubProcAndFree );
	VM_SetWait( core, EvCmdWaitSubProcEnd );
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	スクラッチワークを削除
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdScratchFree(VM_MACHINE * core)
{
	void ** buf;
	FIELDSYS_WORK* fsys = core->fsys;
	buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

	sys_FreeMemoryEz(*buf);
	*buf = NULL;

	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	スクラッチワークから渡された回の木の実と数を取得
 * @param	core		仮想マシン制御構造体へのポインタ
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdScratchItemGet(VM_MACHINE * core)
{
	void ** buf;
	SCRATCH_CALL_WORK* scratch;
	FIELDSYS_WORK* fsys = core->fsys;
	u16 pos		= VMGetWorkValue( core );
	u16* wk_item= VMGetWork( core );
	u16* wk_num = VMGetWork( core );

	buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
	scratch = (SCRATCH_CALL_WORK*)*buf;

	*wk_item= scratch->item_no[pos];
	*wk_num	= scratch->item_num[pos];
	OS_Printf( "*wk_item = %d\n", *wk_item );
	OS_Printf( "*wk_num = %d\n", *wk_num );
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * バトルレコーダー(GDSモード)呼び出し
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"1"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGdsSetProc( VM_MACHINE * core )
{
	u16 gds_mode = VMGetWorkValue(core);
	u16 no		= VMGetWorkValue(core);
	u16* ret_wk = VMGetWork(core);

	if( mydwc_checkMyGSID(core->fsys->savedata) ){
		*ret_wk = 1;	//成功
		Field_Gds_SetProc( core->fsys, no, gds_mode );
		VM_SetWait( core, EvCmdWaitSubProcEnd );
	}else{
		*ret_wk = 0;	//失敗
	}

	return 1;
}

//----------------------------------------------------------------------------
/**
 *	@brief	WiFi広場を開始する
 *
 *	@param	core		仮想マシン制御構造体へのポインタ
 *
 *	@return	"1"
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdWiFiLobbySetProc( VM_MACHINE * core )
{
	u16 wk_id			= VMGetU16( core );
	u16* p_flag_wk		= GetEventWorkAdrs( core->fsys, wk_id );

	// フレンドコードを持ってるときのみ広場にいける
	if( mydwc_checkMyGSID(core->fsys->savedata) ){
		EventCmd_WiFiLobbyProc( core->event_work, *p_flag_wk );
	}
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	ABキーのsys.contチェック
 *
 * @param	core
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdContABKey( VM_MACHINE * core )
{
	u16* ret_wk = VMGetWork(core);

	*ret_wk = 0;

	if( sys.cont & PAD_BUTTON_A ){
		*ret_wk = 1;
	}

	if( sys.cont & PAD_BUTTON_B ){
		*ret_wk = 1;
	}
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	フォルムチェンジしたロトムがいるかチェック(全てチェック)
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
#include "battle/battle_server.h"
#if 0
// ロトムのフォルム定義(BIT指定)
#define FORMNO_ROTOMU_BIT_NORMAL		(1 << FORMNO_ROTOMU_NORMAL)
#define FORMNO_ROTOMU_BIT_HOT			(1 << FORMNO_ROTOMU_HOT)
#define FORMNO_ROTOMU_BIT_WASH			(1 << FORMNO_ROTOMU_WASH)
#define FORMNO_ROTOMU_BIT_COLD			(1 << FORMNO_ROTOMU_COLD)
#define FORMNO_ROTOMU_BIT_FAN			(1 << FORMNO_ROTOMU_FAN)
#define FORMNO_ROTOMU_BIT_CUT			(1 << FORMNO_ROTOMU_CUT)
#endif

static u32 MyRotomuFormCheck(SAVEDATA *sv);

static BOOL EvCmdRotomuFormCheck( VM_MACHINE * core )
{
	u32 rotom_bit;
	FIELDSYS_WORK* fsys	= core->fsys;
	u16*hot_wk			= VMGetWork( core );	//
	u16*wash_wk			= VMGetWork( core );	//
	u16*cold_wk			= VMGetWork( core );	//
	u16*fan_wk			= VMGetWork( core );	//
	u16*cut_wk			= VMGetWork( core );	//

	*hot_wk	= 0;		//
	*wash_wk= 0;		//
	*cold_wk= 0;		//
	*fan_wk	= 0;		//
	*cut_wk	= 0;		//

	rotom_bit = MyRotomuFormCheck( fsys->savedata );

	if( ((rotom_bit >> FORMNO_ROTOMU_HOT) & 0x01) == 1 ){
		*hot_wk = 1;
	}

	if( ((rotom_bit >> FORMNO_ROTOMU_WASH) & 0x01) == 1 ){
		*wash_wk = 1;
	}

	if( ((rotom_bit >> FORMNO_ROTOMU_COLD) & 0x01) == 1 ){
		*cold_wk = 1;
	}

	if( ((rotom_bit >> FORMNO_ROTOMU_FAN) & 0x01) == 1 ){
		*fan_wk = 1;
	}

	if( ((rotom_bit >> FORMNO_ROTOMU_CUT) & 0x01) == 1 ){
		*cut_wk = 1;
	}

	OS_Printf( "*hot_wk = %d\n", *hot_wk );
	OS_Printf( "*wash_wk = %d\n", *wash_wk );
	OS_Printf( "*cold_wk = %d\n", *cold_wk );
	OS_Printf( "*fan_wk = %d\n", *fan_wk );
	OS_Printf( "*cut_wk = %d\n", *cut_wk );
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief   自分の手持ち、ボックス、育て屋、からフォルムチェンジしたロトムがいるか取得
 *
 * @param   sv		セーブデータへのポインタ
 *
 * @retval  FORMNO_ROTOMU_BIT_??? が ORの総和で返ってきます
 * 			※ノーマルフォルムでもビットが立つことに注意
 */
//--------------------------------------------------------------
static u32 MyRotomuFormCheck(SAVEDATA *sv)
{
	int i;
	POKEMON_PARAM *pp;
	POKEMON_PASO_PARAM *ppp;
	u32 form_bit;

	form_bit = 0;

	//手持ちチェック
	{
		POKEPARTY *party;
		int temoti_max;

		party = SaveData_GetTemotiPokemon(sv);
		temoti_max = PokeParty_GetPokeCount(party);
		for(i = 0; i < temoti_max; i++){
			pp = PokeParty_GetMemberPointer(party, i);
			if(PokeParaGet(pp, ID_PARA_monsno, NULL) == MONSNO_PURAZUMA
					&& PokeParaGet(pp, ID_PARA_tamago_flag, NULL) == 0){
				form_bit |= 1 << PokeParaGet(pp, ID_PARA_form_no, NULL);
			}
		}
	}

	//育て屋チェック
	{
		SODATEYA_WORK *sodateya;
		SODATEYA_POKE *s_poke;

		sodateya = SaveData_GetSodateyaWork(sv);
		for(i = 0; i < SODATEYA_POKE_MAX; i++){
			s_poke = SodateyaWork_GetSodateyaPokePointer(sodateya, i);
			ppp = SodateyaPoke_GetPokePasoPointer(s_poke);
			if(PokePasoParaGet(ppp,ID_PARA_monsno,NULL) == MONSNO_PURAZUMA
					&& PokePasoParaGet(ppp, ID_PARA_tamago_flag, NULL) == 0){
				form_bit |= 1 << PokePasoParaGet(ppp, ID_PARA_form_no, NULL);
			}
		}
	}

	//ボックスチェック
	{
		BOX_DATA *boxdata;
		u32 tray;

		boxdata = SaveData_GetBoxData(sv);
		for(tray = 0; tray < BOX_MAX_TRAY; tray++){
			for(i = 0; i < BOX_MAX_POS; i++){
				ppp = BOXDAT_GetPokeDataAddress(boxdata, tray, i);
				if(PokePasoParaGet(ppp, ID_PARA_monsno, NULL) == MONSNO_PURAZUMA
						&& PokePasoParaGet(ppp, ID_PARA_tamago_flag, NULL) == 0){
					form_bit |= 1 << PokePasoParaGet(ppp, ID_PARA_form_no, NULL);
				}
			}
		}
	}

	//PHCの隠し領域チェック
	{
		pp = PokemonParam_AllocWork(HEAPID_EVENT);
		ppp = PPPPointerGet(pp);
		if(PhcSvData_GetPokemon( SaveData_GetPhcSaveData(sv), (u8*)ppp)){
			if(PokePasoParaGet(ppp, ID_PARA_monsno, NULL) == MONSNO_PURAZUMA
					&& PokePasoParaGet(ppp, ID_PARA_tamago_flag, NULL) == 0){
				form_bit |= 1 << PokePasoParaGet(ppp, ID_PARA_form_no, NULL);
			}
		}
		sys_FreeMemoryEz(pp);
	}
	return form_bit;
}

//----------------------------------------------------------------------------
/**
 *	@brief	スコア加算
 *
 *	@param	core		仮想マシン制御構造体へのポインタ
 *
 *	@return	"0"
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdScoreAdd( VM_MACHINE * core )
{
	u16 id			= VMGetU16( core );
	RECORD_Score_Add( SaveData_GetRecord(core->fsys->savedata), id );
	return 0;
}

//----------------------------------------------------------------------------
/**
 *	@brief	(フロンティアの)ヒープチェック
 *
 *	@param	core		仮想マシン制御構造体へのポインタ
 *
 *	@return	"0"
 */
//-----------------------------------------------------------------------------
u32 debug_world_heap;
u32 debug_field_heap;
u32 debug_event_heap;
static BOOL EvCmdHeapCheck( VM_MACHINE * core )
{
	FIELDSYS_WORK *fsys = core->fsys;
	u16 flag			= VMGetWorkValue(core);
	u32 free_world_heap,free_field_heap,free_event_heap;

	//現在のヒープの空き領域サイズを返す
	free_world_heap = sys_GetHeapFreeSize( HEAPID_WORLD );
	free_field_heap = sys_GetHeapFreeSize( HEAPID_FIELD );
	free_event_heap = sys_GetHeapFreeSize( HEAPID_EVENT );
	OS_Printf( "現在のヒープの空き world_heap = %d\n", free_world_heap );
	OS_Printf( "現在のヒープの空き field_heap = %d\n", free_field_heap );
	OS_Printf( "現在のヒープの空き event_heap = %d\n", free_event_heap );

	//セット
	if( flag == 0 ){
		//デバック変数に保存
		debug_world_heap = free_world_heap;
		debug_field_heap = free_field_heap;
		debug_event_heap = free_event_heap;

	//チェック
	}else{
		if( free_world_heap != debug_world_heap ){
			OS_Printf( "フロンティア呼び出し前 debug_world_heap = %d\n", debug_world_heap );
			GF_ASSERT( (0) && "メモリの開放忘れがあるかもしれません" );
		}

#if 0
		if( free_field_heap != debug_field_heap ){
			OS_Printf( "フロンティア呼び出し前 debug_field_heap = %d\n", debug_field_heap );
			GF_ASSERT( (0) && "メモリの開放忘れがあるかもしれません" );
		}

		//ステージで、応援OBJをINIT_CHANGEで追加するので、ここで引っかかるので外した(08.05.19)
#endif

		if( free_event_heap != debug_event_heap ){
			OS_Printf( "フロンティア呼び出し前 debug_event_heap = %d\n", debug_event_heap );
			GF_ASSERT( (0) && "メモリの開放忘れがあるかもしれません" );
		}
	}

	return 0;
}

//----------------------------------------------------------------------------
/**
 *	@brief	WiFiひろばカウンターでの入場可能な時間チェック処理
 *
 *	@param	core		仮想マシン制御構造体へのポインタ
 *
 *	@return "0"
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdWflbyCounterTime( VM_MACHINE * core )
{
	FIELDSYS_WORK *fsys = core->fsys;
	u16* ret_wk = VMGetWork(core);
	s64	now_time;
	s64 diff;

#ifdef _WIFI_DEBUG_TUUSHIN
	{
		*ret_wk = 1;	// WiFiひろば入室許可
		return 0;
	}
#endif

	now_time = GF_RTC_GetDateTimeBySecond();
	diff = now_time - fsys->wflby_counter.time;
	if( diff >= WFLBY_COUNTER_INTERVAL ){
		*ret_wk = 1;	// WiFiひろば入室許可
	}else{
		*ret_wk = 0;	// WiFiひろば入室拒否
	}

	return 0;
}

//----------------------------------------------------------------------------
/**
 *	@brief	やぶれた世界でのギラティナフォルム強制セット
 *
 *	@param	core		仮想マシン制御構造体へのポインタ
 *
 *	@return "0"
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdGirathinaFormUpdate( VM_MACHINE * core )
{
	FIELDSYS_WORK *fsys = core->fsys;
	POKEPARTY *party;
	u16 flag= VMGetWorkValue(core);

	party	= SaveData_GetTemotiPokemon( core->fsys->savedata );
	PokePartyGirathinaFormUpdate( party, flag );
	{//図鑑登録(ギラティナがフォルム変わった時用)
	#if PL_G0198_080711_FIX
		int i, poke_max;
		POKEMON_PARAM *pp;
		poke_max = PokeParty_GetPokeCount(party);
		for(i = 0; i < poke_max; i++){
			pp = PokeParty_GetMemberPointer(party, i);
			if(PokeParaGet(pp, ID_PARA_tamago_flag, NULL) == 0){
				ZukanWork_SetPokeGet(
					SaveData_GetZukanWork(fsys->savedata), pp);
			}
		}
	#else
		int i, poke_max;
		poke_max = PokeParty_GetPokeCount(party);
		for(i = 0; i < poke_max; i++){
			ZukanWork_SetPokeGet(
				SaveData_GetZukanWork(fsys->savedata), PokeParty_GetMemberPointer(party, i));
		}
	#endif
	}
	return 0;
}

//----------------------------------------------------------------------------
/**
 *	@brief	手持ちに配布ポケモンがいるかチェック
 *
 *	@param	core		仮想マシン制御構造体へのポインタ
 *
 *	@return "0"
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdHaihuPokeCheck( VM_MACHINE * core )
{
	u32 monsno,mine = 0;
	POKEMON_PARAM* pp;
	u8	id = VMGetU8(core);	//id
	u16	no = VMGetWorkValue(core);	//手持ちの何番目？
	u16* ret_wk	= VMGetWork( core );

	*ret_wk = 0;
	pp = PokeParty_GetMemberPointer(SaveData_GetTemotiPokemon(core->fsys->savedata),no);

	if(id >= HAIHU_POKE_ID_MAX){
		return 0;
	}
	//タマゴは除外
	if(	PokeParaGet(pp,ID_PARA_tamago_flag,NULL) ||
		PokeParaGet(pp,ID_PARA_fusei_tamago_flag,NULL)){
		return 0;
	}
	//親ID一致チェック
	if(PokeParaGet(pp,ID_PARA_id_no,NULL) == MyStatus_GetID(SaveData_GetMyStatus(core->fsys->savedata))){
		mine = TRUE;
	}else{
		mine = FALSE;
	}
	//正規ルート入手チェック
	if(!HaihuPokeCheckFromTrMemo(id,pp,mine)){
		return 0;
	}

	//モンスターナンバーチェック
	monsno = PokeParaGet(pp,ID_PARA_monsno,NULL);
	switch(id){
	case HAIHU_POKE_ID_PITYUU:
		if(monsno == MONSNO_PITYUU || monsno == MONSNO_PIKATYUU || monsno == MONSNO_RAITYUU){
			if(PokeRareGet(pp)){	//レアならTRUE
				*ret_wk = TRUE;
			}
		}
		break;
	case HAIHU_POKE_ID_ARUSEUSU:
	case HAIHU_POKE_ID_ARUSEUSU_THEATER:
		if(monsno == MONSNO_AUSU){
			*ret_wk = TRUE;
		}
		break;
	case HAIHU_POKE_ID_SEREBHI:
		if(monsno == MONSNO_SEREBHI){
			*ret_wk = TRUE;
		}
		break;
	}
	return 0;
}



//--------------------------------------------------------------------------------------------
/**
 * @brief		スクリプトコマンド：サイズの大きい連れ歩きポケモンかをチェック
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_CheckBig( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = core->fsys;
    u16* ret_wk			= VMGetWork( core );
    FIELD_OBJ_PTR fldobj = FieldOBJSys_OBJIDSearch( fsys->fldobjsys, FLDOBJ_ID_POKE_PAIR );
    *ret_wk = PairPoke_GetInfo_BigSize(fldobj);

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		スクリプトコマンド：仮実装
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_TestBallon( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = core->fsys;
    FIELD_OBJ_PTR fldobj = FieldOBJSys_OBJIDSearch( fsys->fldobjsys, FLDOBJ_ID_POKE_PAIR );
    //FE_PokeBallon_Add( fldobj, 0 );
	PokeBallon_CallEvent(fsys, fldobj, 0);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		自機と連れ歩きポケモンを入れ替える
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_ChangePosition( VM_MACHINE * core )
{
    u16 t;
    FIELD_OBJ_PTR target_a;
    FIELD_OBJ_PTR target_b;
    FIELDSYS_WORK * fsys = core->fsys;

    t = VMGetU16( core );

    if (t == TARGET_PLAYER_PAIR){		//自機の位置にポケモンを移動（自機はポケモンの位置へ）
        target_a = Player_FieldOBJGet(fsys->player);	//自機
        target_b = PairPoke_GetFldObjPtr(fsys);			//ポケモン
    }else if( t == TARGET_PAIR_PLAYER){	//ポケモンの位置に自機を移動（ポケモンは自機の位置へ）
        target_a = PairPoke_GetFldObjPtr(fsys);			//ポケモン
        target_b = Player_FieldOBJGet(fsys->player);	//自機
    }else{
        GF_ASSERT(0);
        return 0;
    }

    PairPokeFldMove_CallEvent(target_a, target_b, core->event_work);

    return 1;	//イベントコールしたので、1をリターン
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモンがポケセンカウンターにジャンプ
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_PCCounterJumpAnm( VM_MACHINE * core )
{
    PairPokeEvAnm_PCCounterBallIn(core->fsys);
    return 1;	//イベントコールしたので、1をリターン
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモンをボールへ格納
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_BallIn( VM_MACHINE * core )
{
	BOOL rc;
    rc = PairPokeEvAnm_BallIn(core->fsys);
	if (rc){
		return 1;	//イベントコールした場合は1をリターン
	}

	return 0;
}


//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモン対応会話開始
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_TalkStart( VM_MACHINE * core )
{
    BOOL turn;
    turn = TRUE;
    //ポケモンを連れ歩いているかチェック
    if (PairPoke_IsPairPoke(core->fsys)){
        FIELD_OBJ_PTR fldobj = PairPoke_GetFldObjPtr(core->fsys);
        //大きいポケモンかチェック
        if (PairPoke_GetInfo_BigSize(fldobj)){
			VecFx32 vec;
            FIELD_OBJ_PTR fldobj = Player_FieldOBJGet( Player_FieldSysWorkPlayerGet( core->fsys ) );
            int dir = Player_DirGet( Player_FieldSysWorkPlayerGet( core->fsys ) );
            int x = FieldOBJ_NowPosGX_Get( fldobj ) + (FieldOBJ_DirAddValueGX( dir )*2);
            int y = FieldOBJ_NowPosGY_Get( fldobj );
            int z = FieldOBJ_NowPosGZ_Get( fldobj ) + (FieldOBJ_DirAddValueGZ( dir )*2);
			u8 attr = GetAttributeLSB(core->fsys, x, z);

			FieldOBJ_VecPosGet( fldobj, &vec );
            //連れ歩きポケモンの後ろに当たり判定・ＮＰＣがいるかチェック(自機の2歩先をチェック)
            if ( MPTL_CheckHitWall(core->fsys, &vec, x, z, NULL) || MATR_IsWater(attr) ||
                 FieldOBJ_MoveHitCheckFellow(fldobj,x,y,z) ){
                turn = FALSE;
            }
        }

        if (turn){
            return EvCmdObjTurn( core );
        }
    }

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモンのポーズ解除
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_PauseCnt( VM_MACHINE * core )
{
	u16 pause;
	pause = VMGetU16( core );
	//ポケモンを連れ歩いているかチェック
    if (PairPoke_IsPairPoke(core->fsys)){
		if ( pause ){
			//ポーズ
			FieldOBJ_MovePause( PairPoke_GetFldObjPtr(core->fsys) );
			#ifdef PM_DEBUG
				DebugEvent_PairPokeAnmPauseEnd(core->fsys->event);
			#endif	//PM_DEBUG
		}else{
			//連れ歩きポケモンポーズ解除
			FieldOBJ_MovePauseClear( PairPoke_GetFldObjPtr(core->fsys) );
			#ifdef PM_DEBUG
				DebugEvent_PairPokeAnmPauseSet(core->fsys->event);
			#endif	//PM_DEBUG
		}
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモンのアニメ待ち
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_WaitAnime( VM_MACHINE * core )
{
	if (PairPoke_IsPairPoke(core->fsys)){
		VM_SetWait( core, EvWaitPairPokeAnm );
	}
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモンの動作コード変更
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_ChangeMoveCode( VM_MACHINE * core )
{
	u16 code;
	code	= VMGetU16( core );
	//連れ歩きポケモンいる場合のみ
	if (PairPoke_IsPairPoke(core->fsys)){
		//コードチェンジ
		FIELD_OBJ_PTR fldobj;
		fldobj	= FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, FLDOBJ_ID_POKE_PAIR );
		FieldOBJ_MoveCodeChange( fldobj, code );
	}
	return 1;
}

//return 1 = 終了
static BOOL EvWaitPairPokeAnm(VM_MACHINE * core)
{
    //ポケモンの移動アニメを終わらせる
	if ( FieldOBJ_AcmdEndCheck( PairPoke_GetFldObjPtr(core->fsys) ) ){
		//コードチェンジ
///		FIELD_OBJ_PTR fldobj;
///		fldobj	= FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, FLDOBJ_ID_POKE_PAIR );
///		FieldOBJ_MoveCodeChange( fldobj, MV_PAIR_NO_RATE );
		OS_Printf("連れるきポケのアニメコマンド終了\n");
		return 1;
    }
    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモンを自機の隣にセット
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_SetPlayerSidePos( VM_MACHINE * core )
{
	u8 side = VMGetU8( core );
	u8 dir = VMGetU8( core );

	//連れ歩きポケモンいる場合のみ
	if (PairPoke_IsPairPoke(core->fsys)){
		FIELD_OBJ_PTR player = Player_FieldOBJGet(core->fsys->player);
    	FIELD_OBJ_PTR player_pair = FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, FLDOBJ_ID_POKE_PAIR );
		PairPoke_SetPlayerSide(player, player_pair, side, dir);
	}
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	連れ歩きポケモンを自機に重ねて、出現アニメの有無を決定する
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdPairPoke_SetPlayerPos( VM_MACHINE * core )
{
	if ( PairPoke_IsPairPoke(core->fsys) ){
		FIELD_OBJ_PTR poke;
		poke = PairPoke_GetFldObjPtr(core->fsys);
		if ( PairPoke_CheckFollowable(PairPoke_GetMonsNo(poke), core->fsys->location->zone_id) ) {
			PairPoke_SetAppAnmPrm(poke, 1);
			PairPoke_SetVanishFlgPrm(poke,1);//一歩移動で表示状態にする
			PairPoke_SetPlayerPos(core->fsys, DIR_DOWN);
		}
	}
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	連れ歩きポケモンを自機に重ねる(座標移動のみ)
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdPairPoke_SetPlayerPosNoSt( VM_MACHINE * core )
{
	if ( PairPoke_IsPairPoke(core->fsys) ){
		FIELD_OBJ_PTR poke;
		poke = PairPoke_GetFldObjPtr(core->fsys);
		if ( PairPoke_CheckFollowable(PairPoke_GetMonsNo(poke), core->fsys->location->zone_id) ) {
			PairPoke_SetPlayerPos(core->fsys, DIR_DOWN);
		}
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモンのボールから出てくるアニメ
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_Appear( VM_MACHINE * core )
{
	if (PairPoke_IsPairPoke(core->fsys)){
		FIELD_OBJ_PTR player_pair = FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, FLDOBJ_ID_POKE_PAIR );
		PairPoke_Appear(player_pair);
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモンをグリッド中心にセット
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_SetGridCenter( VM_MACHINE * core )
{
	if (PairPoke_IsPairPoke(core->fsys)){
		FIELD_OBJ_PTR player_pair = FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, FLDOBJ_ID_POKE_PAIR );
		FieldObj_SetPairPokeGridCenter( player_pair );
	}
	return 1;
}



//--------------------------------------------------------------------------------------------
/**
 * @brief		シームレスカメラ変更
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdMoveSeamlessCamera(VM_MACHINE * core)
{
	u16 code;
	code	= VMGetU16( core );
	SMLS_CamCnt_Request(core->fsys->SmlsCamCntPtr, code);
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		ポケスロンコール
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCallPokethlonProc(VM_MACHINE * core)
{
	u8 flg  = VMGetU8( core );
	u8 all_star = VMGetU8( core );
	u16 course = VMGetWorkValue( core );
	u16 * exit = VMGetWork( core );
	u16 * score = VMGetWork( core );
	u16 * point = VMGetWork( core );
	u16 * rank = VMGetWork( core );


	OS_Printf("conest=%d, crsID=%d\n",flg,course);

	PokethlonCall_SetupEvent(core->fsys, flg, all_star, course, exit, score, point, rank);

	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		指定ワークにサポートのObjCharCodeを取得
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetSupportObjCharCode(VM_MACHINE* core)
{
	u16	*work;

	work = VMGetWork( core );

	if(MyStatus_GetMySex(SaveData_GetMyStatus(GameSystem_GetSaveData(core->fsys)))){
		*work = HERO;
	}else{
		*work = HEROINE;
	}
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		ポケギアアプリのオープンフラグをセット
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSetPGearAppOpenFlag(VM_MACHINE* core)
{
	PGEAR_SAVE* pg_sv = SaveData_GetPGearSave(GameSystem_GetSaveData(core->fsys));

    u8	flag = VMGetU8( core );

	switch(flag){
	case 1:
		PGearSv_SetAppOpenFlag(pg_sv,PGAPP_OPEN_MAP);
		break;
	case 2:
		PGearSv_SetAppOpenFlag(pg_sv,PGAPP_OPEN_RADIO);
		break;
	case 0:
	default:
		PGearSv_SetAppOpenFlag(pg_sv,PGAPP_OPEN_NONE);
		break;
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		ポケギアマップのオープンレベルをセット
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSetPGearMapOpenLevel(VM_MACHINE* core)
{
    u8	level = VMGetU8( core );

	PGearSv_SetMapOpenLevel(SaveData_GetPGearSave(core->fsys->savedata),level);
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		ポケギア 電話帳登録リスト追加
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdAddTelNumber(VM_MACHINE* core)
{
	PGEAR_SAVE* pg_sv = SaveData_GetPGearSave(GameSystem_GetSaveData(core->fsys));

	u8	number = (u8)VMGetWorkValue(core);

	if(number < PMTEL_NUMBER_MAX){
		PGearSv_AddTelNumber(pg_sv,number);
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		ポケギア 電話帳登録チェック
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdIsTelNumberEntry(VM_MACHINE* core)
{
	PGEAR_SAVE* pg_sv = SaveData_GetPGearSave(GameSystem_GetSaveData(core->fsys));

	u8	number = (u8)VMGetWorkValue(core);
	u16* work = VMGetWork(core);

	if(number < PMTEL_NUMBER_MAX){
		*work = PGearSv_IsTelNumberEntry(pg_sv,number);
		if(*work == PMTEL_NUMBER_NULL){
			*work = FALSE;
		}else{
			*work = TRUE;
		}
	}else{
		*work = FALSE;
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		ポケギアアプリ　電話着信モードパラメータセット
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCallPGearTelParamSet(VM_MACHINE* core)
{
	u8	number = (u8)VMGetWorkValue(core);
	u8	ev_type = (u8)VMGetWorkValue(core);
	u8	ev_id = (u8)VMGetWorkValue(core);
	void** buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

	FldPMTel_CallupFlagSet(FldPMTel_PointerGet(core->fsys));
	core->fsys->sublcd_menu_lock_passive = 1;

	//パラメータセット
	FldPMTel_CallParamSet(FldPMTel_PointerGet(core->fsys),number,0xFF,0,ev_type,ev_id);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		ポケギアアプリ呼び出し
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCallPGear(VM_MACHINE* core)
{
	void** buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);

	*buf = FieldPokeGear_SetProc( core->fsys );
    VM_SetWait( core, EvWaitSubProcAndFree );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	電話 指定したトレーナーIDを持つ電話帳データを取得する
 * @param	core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetTelBookFromTrID(VM_MACHINE* core)
{
	PMTEL_BOOK* pBook;

	u16	tr_id = VMGetWorkValue(core);
	u16* work = VMGetWork(core);

	pBook = FldPMTel_GetBookWorkAdrs(FldPMTel_PointerGet(core->fsys));

	*work = PMTelBookData_GetDataFromTrID(tr_id,pBook,HEAPID_EVENT);
	IWASAWA_PRINT("TelBookSearch %d -> %d\n",tr_id,*work);
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	電話 fsys内の電話ワークに取得した電話帳データから登録メッセージIDを取得する
 * @param	core
 *
 * ＊事前にEvCmdGetTelBookFromTrIDを読んで、電話帳データをワークに格納しておくこと
 */
//--------------------------------------------------------------------------------------------
#include "fielddata/script/trainer_def.h"
static BOOL EvCmdGetTelNumberEntryMsg(VM_MACHINE* core)
{
	PMTEL_BOOK* pBook;
	u16 btl_type,tr_id,idx;

	u16* script_id = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_SCRIPT_ID );
	u8	prm_id = VMGetU8(core);
	u16* msg_arc = VMGetWork(core);
	u16* work = VMGetWork(core);

	pBook = FldPMTel_GetBookWorkAdrs(FldPMTel_PointerGet(core->fsys));

	*msg_arc = PMTelData_GetPersonalMsgArcID(pBook->id);

	if(pBook->id == PMTEL_NUMBER_NULL){
		*work = 0;
		return 1;
	}
	if(prm_id > 4){
		prm_id = 0;
	}
	//スクリプトIDから、トレーナーIDを取得
	tr_id = GetTrainerIdByScriptId(*script_id);

	idx = prm_id+1;
	if(tr_id >= SCRID_TRAINER_DATA_MAX){	//視線エンカウント
		//視線エンカウントにダブルは無い
		*work = idx;
	}else{	//話しかけエンカウント

		//ダブルバトルタイプか取得
		btl_type = CheckTrainer2vs2Type( GetTrainerIdByScriptId(*script_id) );
		if(btl_type == 0){	//シングル
			*work = idx;
		}else{	//ダブル
			if(GetTrainerLRByScriptId( *script_id ) == 0){	//ペアの左
				*work = idx;
			}else{	//ペアの右
				*work = idx;
			}
		}
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	電話 再戦フラグをリセットする
 * @param	core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdResetRevengeFlag(VM_MACHINE* core)
{
	u16 number = VMGetWorkValue(core);

	PMTelSv_RevengeFlagSet(SaveData_GetPMTelSave(core->fsys->savedata),number,FALSE);
	return 0;
}


//--------------------------------------------------------------------------------------------
/**
 * @brief	電話 再戦後にあげるアイテムNoを取得
 * @param	core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetRevengeItem(VM_MACHINE* core)
{
	u16* ret_wk = VMGetWork(core);
	PMTEL_BOOK* pBook = FldPMTel_GetBookWorkAdrs(FldPMTel_PointerGet(core->fsys));

	if(pBook->item == ITEM_KURABONOMI){	//木の実系はランダム
		*ret_wk = (gf_rand()%10)+ITEM_KURABONOMI;
	}else{
		*ret_wk = pBook->item;
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	電話 発掘イベントアイテムNo取得
 * @param	core
 *
 * ＊0ならイベント未発生
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetTelItemEvData(VM_MACHINE* core)
{
	PMTEL_BOOK* pBook;
	PMTEL_SAVE* tel_sv;
	u16* ret_wk = VMGetWork(core);

	pBook = FldPMTel_GetBookWorkAdrs(FldPMTel_PointerGet(core->fsys));
	tel_sv = SaveData_GetPMTelSave(core->fsys->savedata);

	*ret_wk = PMTelSv_ItemEvDataGet(tel_sv,pBook->id);

	//ここでアイテムイベントフラグリセットもしちゃう
	PMTelSv_ItemEvDataSet(tel_sv,pBook->id,ITEM_DUMMY_DATA);
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	電話　着信予約
 * @param	core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTelIncomingReservation(VM_MACHINE* core)
{
	u8 reserve_id = VMGetU8(core);
	u8 force_f = VMGetU8(core);

	FldPMTel_IncomingReservation(FldPMTel_PointerGet(core->fsys),reserve_id,force_f);
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	電話　着信予約を強制リセット
 * @param	core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTelResetReserve(VM_MACHINE* core)
{
	u8 reserve_id = VMGetU8(core);

	PMTelSv_CallReserveReset(SaveData_GetPMTelSave(core->fsys->savedata),reserve_id);
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	記念写真を撮る
 * @param	core
 *
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTakePicture(VM_MACHINE* core)
{
	u16 point = VMGetU16( core );

	FldPicture_CallTakePicEvent(core->fsys, point);
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	記念写真の枚数を返す
 * @param	core
 *
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetPictureDataNum(VM_MACHINE* core)
{
	u16* ret_wk = VMGetWork( core );

	*ret_wk = PictureSave_PictureDataNum(SaveData_GetPictureSave(core->fsys->savedata));
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	フォトアルバムコールイベントを呼び出す
 * @param	core
 *
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPhotoAlbumCall(VM_MACHINE* core)
{
	EventCmd_CallFieldAlbum(core->fsys);
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	研究所のモンスターボールセットアップ
 * @param	core
 *
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSetupLaboMOnsBall(VM_MACHINE* core)
{
	int i;
	int ball_num;
	int poke_num;
	FIELDSYS_WORK* fsys = core->fsys;

	VecFx32 vec[3] = {
		{FX32_ONE*131,0,FX32_ONE*65},	//向かって左のボール
		{FX32_ONE*141,0,FX32_ONE*65},	//向かって右のボール
		{FX32_ONE*136,0,FX32_ONE*72},	//向かって手前のボール
	};

	//手持ちのポケモン数を取得
	poke_num = PokeParty_GetPokeCount(SaveData_GetTemotiPokemon(fsys->savedata));

	//作成するボールの数を決定
	if ( CheckEventFlag( fsys, FE_T22_GYM_ITEM_GET ) ){		//はじめのジムリーターに勝利
		ball_num = 0;
	}else if( CheckEventFlag( fsys, FE_T21_RIVAL ) ){		//ライバル奪取後
		ball_num = 1;
	}else if( poke_num > 0 ){								//ポケモン取得後
		ball_num = 2;
	}else{													//ゲーム開始時
		ball_num = 3;
	}

	for(i=0;i<ball_num;i++){
		M3DO_SetMap3DObjExp(fsys->Map3DObjExp,
							BMID_ROOM_LABO_MB,
							&vec[i], NULL,
							fsys->field_3d_anime );
	}

	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 方向取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdObjDirGet( VM_MACHINE * core )
{
	FIELD_OBJ_PTR fldobj;

	u16 obj_id;
    u16 *dir;

	obj_id = VMGetU16( core );
    dir = VMGetWork( core );

	//ＯＢＪのサーチ
	fldobj	= FieldOBJSys_OBJIDSearch( core->fsys->fldobjsys, obj_id );

	if (fldobj != NULL){
		*dir = FieldOBJ_DirDispGet( fldobj );
	}else{
		//エラーの場合
		*dir = DIR_UP;
	}

    return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 連れ歩きリアクションコール
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_SetReaction( VM_MACHINE * core )
{
    FIELDSYS_WORK * fsys = core->fsys;
	PairReact_CallEvnet(fsys);
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		ポケスロンレコードアプリ呼び出し
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCallPkthRecord(VM_MACHINE* core)
{
	void** buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
	u8	mode = VMGetU8(core);

	switch(mode){
	case PKTH_RECORD_POKE:
		*buf = FieldPokethlonPokemonRecord_SetProc( core->fsys );
		break;
	case PKTH_RECORD_EVENT:
		*buf = FieldPokethlonEventRecord_SetProc( core->fsys );
		break;
	case PKTH_RECORD_TRAINER:
		*buf = FieldPokethlonTrainerRecord_SetProc( core->fsys );
		break;
	case PKTH_RECORD_COURCE:
	default:
		*buf = FieldPokethlonCourseRecord_SetProc( core->fsys );
		break;
	}
    VM_SetWait( core, EvWaitSubProcAndFree );
    return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		アンノーンパズルアプリ呼び出し
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCallAnPuzzle(VM_MACHINE* core)
{
	void** buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_SUBPROC_WORK);
	u8	level = VMGetU8(core);

	if(level > AN_PUZZLE_LEVEL_MAX){
		level = 0;
	}
	*buf = FieldAnPuzzle_SetProc( core->fsys,level);
    VM_SetWait( core, EvWaitSubProcAndFree );
    return 1;
}

//-----------------------------------------------------------------------------
/**
 *	リニアデモ(マップジャンプします)
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdCallLinearDemo(VM_MACHINE * core)
{
	u8	linear_dir = VMGetU8( core );
	u8	play_dir = VMGetU8( core );
	int zone = VMGetU16( core );
	int x = VMGetU16( core );
	int z = VMGetU16( core );

	LinearDemo_CallDemo(core->fsys, linear_dir, play_dir, zone, x, z);

	return 1;
}

//-----------------------------------------------------------------------------
/**
 *	船デモ(マップジャンプします)
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdCallShipDemo(VM_MACHINE * core)
{
	u8	ship_dir = VMGetU8( core );
	u8	play_dir = VMGetU8( core );
	int zone = VMGetU16( core );
	int x = VMGetU16( core );
	int z = VMGetU16( core );

	ShipDemo_CallDemo(core->fsys, ship_dir, play_dir, zone, x, z);

	return 1;
}


//-----------------------------------------------------------------------------
/**
 *	伝説デモ
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdCallLegendDemo(VM_MACHINE * core)
{
	int	mode = VMGetU16( core );

//	mode = 0;
	LEGENDDEMOCALL_EventCall( core->fsys, mode );

	return 1;
}

//-----------------------------------------------------------------------------
/**
 *	マイパーティの戦えるポケモンンのリストインデックスを返す
 */
//-----------------------------------------------------------------------------
static BOOL EvCmdCallGetLivingPokeIdxTop(VM_MACHINE * core)
{
	u16 *rc;
	rc = VMGetWork( core );
	*rc = EvPoke_GetLivingPokeIdxTop(SaveData_GetTemotiPokemon(core->fsys->savedata));

	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモンを白フラッシュ
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_WhiteFlash( VM_MACHINE * core )
{
	BOOL rc;
	u8 div = VMGetU8( core );
	u8 wait = VMGetU8( core );
    rc = PairPokeEvAnm_WhiteFlash(core->fsys, div, wait);
	if (rc){
		return 1;	//イベントコールした場合は1をリターン
	}

	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモンがいるか？
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdIsPairPoke( VM_MACHINE * core )
{
	u16 *ret;
	ret = VMGetWork( core );
	if ( PairPoke_IsPairPoke(core->fsys) ){
		*ret = 1;
	}else{
		*ret = 0;
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きポケモンが消えてるか？
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_IsVanish( VM_MACHINE * core )
{
	u16 *ret;
	ret = VMGetWork( core );
	if ( !PairPoke_IsPairPoke(core->fsys) ){
		*ret = 1;		//いないなら消えてるわ
	}else{
		if ( PairPoke_IsVanish(core->fsys) ){
			*ret = 1;
		}else{
			*ret = 0;
		}
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	連れ歩きかいりき使用エフェクト
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 * @param	core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_SetKairikiEff( VM_MACHINE * core )
{
	FldKairikieff_Set(core->fsys);
	return 1;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	連れ歩き機嫌値加算
 * @param	core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_AddHumorVal( VM_MACHINE * core )
{
	s8 val;
	val = VMGetU8( core );
	PAIR_POKE_HUMOR_AddVal(core->fsys->PairPokeHumor, val);
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	連れ歩きのタイプと指定タイプが一致しているかを調べる
 * @param	core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_CheckType( VM_MACHINE * core )
{
	u16 *ret;
	u8 type;
	type = VMGetU8( core );
	ret = VMGetWork( core );
	if ( PairReact_IsSameType(core->fsys, type)){
		//一致
		(*ret) = 1;
	}else{
		//不一致
		(*ret) = 0;
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	連れ歩きのフィールド技使用前ジャンプアクション
 * @brief   イベントコールをかけるので、return 0でスクリプト本体が終了してしまわないように、1を返す
 * @param	core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_JumpAct( VM_MACHINE * core )
{
	u8 jump_num;
	jump_num = VMGetU8( core );
	PairReact_JumpAct(core->fsys, jump_num);
	return 1;
}


//------------------------------------------------------------------
/**
 * @brief   下画面選択システム画面切り替え
 *
 * @param   core
 *
 * @retval  BOOL
 */
//------------------------------------------------------------------
static  BOOL EvCmdCall_SubLcdSelectStart( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;

	// すでに下画面選択肢モードだった場合は即終了（２重掛けをOKにする）
	if(FieldSubLcdControler_GetNowApp( fsys ) == SUBLCD_MODE_YESNO_MENU){
		OS_Printf("すでに下画面モードだけどもう一度下画面切り替えが呼ばれた\n");
		return 0;
	}

	// 下画面システム切り替え
	FieldSubLcdControler_ChangeApp( fsys, SUBLCD_MODE_YESNO_MENU, NULL );

    VM_SetWait( core, EvSubLcdSelectSystem );

	// はい・いいえ画面復帰を予約
	fsys->submenu_app = SUBLCD_MODE_YESNO_MENU;


	return 1;
}

static BOOL EvSubLcdSelectSystem(VM_MACHINE * core)
{
    u32	ret;
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk			= GetEventWorkAdrs( fsys, core->reg[0] );	//注意！
	int app,seq;

	app = FieldSubLcdControler_GetNowApp( fsys );
	seq = FieldSubLcdControler_GetSequence(fsys);

	MORI_PRINT("sub app = %d, seq = %d\n", app, seq);

	// 下画面選択受け入れモードになった事を確認
	if(app==SUBLCD_MODE_YESNO_MENU &&  seq==SUBLCD_SEQ_MAIN){
		return 1;
	}

    return 0;
}



//------------------------------------------------------------------
/**
 * @brief   下画面選択システム画面終了
 *
 * @param   core
 *
 * @retval  BOOL
 */
//------------------------------------------------------------------
static  BOOL EvCmdCall_SubLcdSelectEnd( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;

	// 下画面システム切り替え
	FieldSubLcdControler_ChangeApp( fsys, SUBLCD_MODE_FIELD_MENU, NULL );

    VM_SetWait( core, EvReturnSubLcdSelectSystem );

	// はい・いいえ画面復帰を予約
	fsys->submenu_app = SUBLCD_MODE_FIELD_MENU;

	return 1;
}

static BOOL EvReturnSubLcdSelectSystem(VM_MACHINE * core)
{
    u32	ret;
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk			= GetEventWorkAdrs( fsys, core->reg[0] );	//注意！
	int app,seq;

	app = FieldSubLcdControler_GetNowApp( fsys );
	seq = FieldSubLcdControler_GetSequence(fsys);

	MORI_PRINT("sub app = %d, seq = %d\n", app, seq);

	// 通常メインメニューに戻った事を確認
	if(app==SUBLCD_MODE_FIELD_MENU &&  seq==SUBLCD_SEQ_MAIN){
		return 1;
	}

    return 0;
}


//------------------------------------------------------------------
/**
 * @brief   下画面アプリ予約機能（フィールド構築時に下画面を
 *			メニューにするか、下画面選択肢にするか）
 *
 * @param   core
 *
 * @retval  BOOL
 */
//------------------------------------------------------------------
static BOOL EvCmdCall_SubLcdSelectReserve( VM_MACHINE *core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16 app_no = VMGetU16(core);

	// 画面復帰時を予約
	FieldSubLcdControler_SubApplicationSet( fsys, app_no );	//SUBLCD_MODE_FIELD_MENU = SUB_APP_FIELDMENU
    		                                                //SUBLCD_MODE_YESNO_MENU = SUB_APP_BMPLIST
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 「はい・いいえ」処理
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	1
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdTouchYesNoWin( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys = core->fsys;
    u16 wk_id			= VMGetU16( core );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;

	// はい・いいえ処理に切り替えリクエスト
	FieldSubLcdControler_ChangeSubSeq( fsys, SUBLCD_MODE_YESNO_MENU, 3, &core->reg[1] );

    VM_SetWait( core, EvTouchYesNoSelect );

    return 1;
}

static BOOL EvTouchYesNoSelect(VM_MACHINE * core)
{
    u32	ret;
    FIELDSYS_WORK* fsys = core->fsys;
    u16* ret_wk			= GetEventWorkAdrs( fsys, core->reg[0] );	//注意！
	int app,seq;

	app = FieldSubLcdControler_GetNowApp( fsys );
	seq = FieldSubLcdControler_GetSubSeq( fsys );

	MORI_PRINT("sub app = %d, seq = %d\n", app, seq);

	if(app==SUBLCD_MODE_YESNO_MENU &&  seq==3+3){
		*ret_wk = core->reg[1];
		return 1;
	}

    return 0;
}


//--------------------------------------------------------------
/**
 * @brief	BMPリスト	初期化
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdTouchBmpListInit( VM_MACHINE * core )
{
	EvCmdBmpMenuInitCore( core ,FieldSubLcdControler_GetEvWin( core->fsys ), NULL );

#if 0
    FIELDSYS_WORK* fsys	 = core->fsys;
    WORDSET** wordset	 = GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );
	EV_WIN_WORK **ev_win = FieldSubLcdControler_GetEvWin( fsys );
    u8 x				 = VMGetU8(core);
    u8 y				 = VMGetU8(core);
    u8 cursor			 = VMGetU8(core);
    u8 cancel			 = VMGetU8(core);
    u16 wk_id			 = VMGetU16( core );

    //初期化
    *ev_win	= CmdEvBmpList_Init( fsys, x, y, cursor, cancel,
                                 GetEventWorkAdrs(fsys,wk_id), *wordset,
                                 GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_MSGWINDAT),
                                 NULL );
    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;
#endif
    return 1;
}



//--------------------------------------------------------------
/**
 * @brief	BMPリスト	初期化(読み込んでいるgmmファイルを使用する)
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdTouchBmpListInitEx( VM_MACHINE * core )
{
	EvCmdBmpMenuInitCore( core ,FieldSubLcdControler_GetEvWin( core->fsys ), core->msgman );
#if 0
    FIELDSYS_WORK* fsys	= core->fsys;
    WORDSET** wordset	= GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WORDSET );
	EV_WIN_WORK **ev_win	= FieldSubLcdControler_GetEvWin( fsys );
    u8 x				= VMGetU8(core);
    u8 y				= VMGetU8(core);
    u8 cursor			= VMGetU8(core);
    u8 cancel			= VMGetU8(core);
    u16 wk_id			= VMGetU16( core );

    //初期化
    *ev_win	= CmdEvBmpList_Init( fsys, x, y, cursor, cancel,
                                 GetEventWorkAdrs(fsys,wk_id), *wordset,
                                 GetEvScriptWorkMemberAdrs(core->fsys,ID_EVSCR_MSGWINDAT),
                                 core->msgman );

    //仮想マシンの汎用レジスタにワークのIDを格納
    core->reg[0] = wk_id;
#endif
    return 1;
}
//--------------------------------------------------------------
/**
 * @brief	BMPリスト	リスト作成
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdTouchBmpListMakeList( VM_MACHINE * core )
{
	EV_WIN_WORK **ev_win	= FieldSubLcdControler_GetEvWin( core->fsys );

    u16 msg_id			= VMGetWorkValue(core);
    u16 talk_msg_id		= VMGetWorkValue(core);
    u16 param			= VMGetWorkValue(core);

    CmdEvBmpList_MakeList( *ev_win, msg_id, talk_msg_id, param );
    return 0;
}

//--------------------------------------------------------------
/**
 * @brief	BMPリスト	開始
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static int TouchBmpListCallBack( void * work, u32 pos );

static BOOL EvCmdTouchBmpListStart( VM_MACHINE * core )
{
    FIELDSYS_WORK* fsys	= core->fsys;
	EV_WIN_WORK **ev_win	= FieldSubLcdControler_GetEvWin( fsys );

	// はい・いいえ処理に切り替えリクエスト
	FieldSubLcdControler_ChangeSubSeq( fsys, SUBLCD_MODE_YESNO_MENU, 7, GetEventWorkAdrs(fsys,core->reg[0]) );

	// コールバックセット
	FieldSubLcdControler_YNCallBackSet( fsys, TouchBmpListCallBack, *ev_win );

	VM_SetWait( core, EvSelTouchWinWait );
    return 1;
}

//ウェイト関数
static BOOL EvSelTouchWinWait(VM_MACHINE * core)
{
    FIELDSYS_WORK* fsys = core->fsys;
	EV_WIN_WORK **ev_win  = FieldSubLcdControler_GetEvWin( fsys );
    u16* ret_wk           = GetEventWorkAdrs( fsys, core->reg[0] );	//注意！

    if( *ret_wk == EV_WIN_NOTHING ){
        return FALSE;	//継続
    }

	// EV_WIN解放
	EvWinWork_Release( *ev_win );

    return TRUE;		//終了
}

static int TouchBmpListCallBack( void * work, u32 pos )
{
	EvWin_ListMsgWrite( work, pos );
	return 0;
}


//--------------------------------------------------------------
/**
 * @brief	下画面数値入力開始
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
typedef struct {
	NUMSEL_PARAM * prm;
	u32	mode;
}EVWK_NUMSEL_SUBLCD;

static u32 DepositMaxGet( FIELDSYS_WORK * fsys, u32 mode )
{
	u32	mg, dg;
	u32	max;

	// 所持金
	mg = MyStatus_GetGold( SaveData_GetMyStatus(fsys->savedata) );
	// 貯金
	dg = PMTelSv_DepositControl( SaveData_GetPMTelSave(fsys->savedata), PMTEL_DEPOSIT_GET, 0 );

	switch( mode ){
	case 0:		// お母さんにお金を預ける
		if( mg > ( PMTEL_DEPOSIT_MAX - dg ) ){
			max = PMTEL_DEPOSIT_MAX - dg;
		}else{
			max = mg;
		}
//		max = MyStatus_GetGold( SaveData_GetMyStatus(fsys->savedata) );
		break;

	case 1:		// お母さんからお金を受け取る
		if( dg > ( MY_GOLD_MAX - mg ) ){
			max = MY_GOLD_MAX - mg;
		}else{
			max = dg;
		}
//		max = PMTelSv_DepositControl( SaveData_GetPMTelSave(fsys->savedata), PMTEL_DEPOSIT_GET, 0 );
		break;

	default:
		GF_ASSERT( 0 );
	}

	return max;
}

static BOOL EvCmdNumSelSubLCDCall( VM_MACHINE * core )
{
	void** buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_PWORK);
	EVWK_NUMSEL_SUBLCD * wk;
	u16 mode	= VMGetU16( core );		// モード
	u16 ret		= VMGetU16( core );		// 戻り値

	*buf = sys_AllocMemory( HEAPID_FIELD, sizeof(EVWK_NUMSEL_SUBLCD) );
	wk = *buf;
	wk->prm  = sys_AllocMemory( HEAPID_FIELD, sizeof(NUMSEL_PARAM) );
	wk->mode = mode;

	wk->prm->max = DepositMaxGet( core->fsys, mode );
	wk->prm->num = NUMSEL_SUBLCD_RET_NONE;

	FieldSubLcdControler_ChangeApp( core->fsys, SUBLCD_MODE_NUMSEL_MENU, wk->prm );

    // 仮想マシンの汎用レジスタにワークのIDを格納
	core->reg[0] = ret;

	VM_SetWait( core, EvNumSelWait );
	return 1;
}

// ウェイト
static BOOL EvNumSelWait(VM_MACHINE * core)
{
	void** buf = GetEvScriptWorkMemberAdrs(core->fsys, ID_EVSCR_PWORK);
	EVWK_NUMSEL_SUBLCD * wk;
	u16 * ret	= GetEventWorkAdrs( core->fsys, core->reg[0] );

	wk = *buf;

	if( wk->prm->num == NUMSEL_SUBLCD_RET_NONE ){
		return FALSE;
	}

	if( wk->prm->num == NUMSEL_SUBLCD_RET_CANCEL ){
		*ret = 1;
	}else{
		SAVEDATA * sv = core->fsys->savedata;
		switch( wk->mode ){
		case 0:		// お母さんにお金を預ける
			Mystatus_SubGold( SaveData_GetMyStatus(sv), wk->prm->num );
			PMTelSv_DepositControl( SaveData_GetPMTelSave(sv), PMTEL_DEPOSIT_ADD, wk->prm->num );
			break;

		case 1:		// お母さんからお金を受け取る
			Mystatus_AddGold( SaveData_GetMyStatus(core->fsys->savedata), wk->prm->num );
			PMTelSv_DepositControl( SaveData_GetPMTelSave(sv), PMTEL_DEPOSIT_SUB, wk->prm->num );
			break;

		default:
			GF_ASSERT( 0 );
		}
		*ret = 0;
	}

	sys_FreeMemoryEz( wk->prm );
	sys_FreeMemoryEz( *buf );

    return TRUE;		//終了
}

// 貯金チェック
static BOOL EvDepositCheck( VM_MACHINE * core )
{
	u16 mode	= VMGetU16( core );		// モード
	u16 work	= VMGetU16( core );		// 戻り値
	u16 * ret;
	u32	gold;

	ret = GetEventWorkAdrs( core->fsys, work );

	// 預ける
	if( mode == 0 ){
		gold = PMTelSv_DepositControl( SaveData_GetPMTelSave(core->fsys->savedata), PMTEL_DEPOSIT_GET, 0 );
		if( gold == PMTEL_DEPOSIT_MAX ){
			*ret = 1;
		}else{
			*ret = 0;
		}
	// 引き出す
	}else{
		gold = MyStatus_GetGold( SaveData_GetMyStatus(core->fsys->savedata) );
		if( gold == MY_GOLD_MAX ){
			*ret = 1;
		}else{
			*ret = 0;
		}
	}

	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	岩砕き終了後イベント
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdRockRslt( VM_MACHINE * core )
{
	u16 is_pair = VMGetWorkValue( core );
	u16 * ans = VMGetWork( core );
	u16 * item = VMGetWork( core );

	RockRslt_CallEvt(core->fsys, is_pair, ans, item);
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	頭突き終了後イベント
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdHeadRslt( VM_MACHINE * core )
{
	u16 * ans = VMGetWork( core );
	HeadRslt_CallEvt(core->fsys, ans);
	return 1;
}



//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	ワーク確保
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdAllocLegFldDemoWork( VM_MACHINE * core )
{
	FldLegDemo_Init(core->fsys);
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	ワーク解放
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdFreeLegFldDemoWork( VM_MACHINE * core )
{
	FldLegDemo_End(core->fsys);
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	鈴出現
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdAppLegBell( VM_MACHINE * core )
{
	FldLegDemo_AppearBell(core->fsys);
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	共鳴
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdAppLegReso( VM_MACHINE * core )
{
	u8 vanish = VMGetU16( core );
	FldLegDemo_StartBellResonance(core->fsys, vanish);
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	ルギア目
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdAppLegEyes( VM_MACHINE * core )
{
	FldLegDemo_CallEyesEvt(core->fsys);
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	マップ付属鈴発光
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdStartLegMapBellAnm( VM_MACHINE * core )
{
	FldLegDemo_StartMapBellAnm(core->fsys);
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	カメラセット
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdSetLegCam( VM_MACHINE * core )
{
	u8 no = VMGetU16( core );
	FldLegDemo_SetCamera(core->fsys, no);
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	カメラ移動
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdMoveLegCam( VM_MACHINE * core )
{
	u8 no = VMGetU16( core );
	FldLegDemo_MoveCamera( core->fsys, no );
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	カメラ移動
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdMoveLegCamWait( VM_MACHINE * core )
{
	FldLegDemo_MoveCameraWait(core->fsys);
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	ポケ降臨
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdDescendLegPoke( VM_MACHINE * core )
{
	FldLegDemo_CallDescendPokeEvt(core->fsys);
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	天候開始
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdStartLegWeather( VM_MACHINE * core )
{
	FldLegDemo_StartWeatherEffect(core->fsys);
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	天候終了
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdEndLegWeather( VM_MACHINE * core )
{
	FldLegDemo_EndWeatherEffect(core->fsys);
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	アプリデモ終了後フィールドデモメモリ確保
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdInitLegAfApp( VM_MACHINE * core )
{
	FldLegDemo_InitAfterApp(core->fsys);
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	アプリデモ終了後フィールドデモメモリ解放
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdEndLegAfApp( VM_MACHINE * core )
{
	FldLegDemo_EndAfterApp(core->fsys);
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	伝説系フィールドデモ	フリームーブのためのカメラ戻し
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdReturnLegCamera( VM_MACHINE * core )
{
	FldLegDemo_ReturnCamera(core->fsys);
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	連れ歩きポケ出現禁止
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdPairPoke_AppForbdn( VM_MACHINE * core )
{
	u8	forbidden = VMGetU8(core);
	PairPokeDataSave_SetForbidden(PairPokeDataSave_GetSaveDataPtr(core->fsys->savedata), forbidden);
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	指定オーバーレイ領域のロード/アンロード
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdOverlaySet( VM_MACHINE * core )
{
	u8	overlay_idx = VMGetU8(core);
	u8	mode = VMGetU8(core);

	static const u32 IdTbl[SCR_OVERLAY_ID_MAX] = {
	 FS_OVERLAY_ID(field_ookisa_kurabe),
	 FS_OVERLAY_ID(field_mushitori),
	 FS_OVERLAY_ID(field_kaseki),
	 FS_OVERLAY_ID(field_point_win),
	 FS_OVERLAY_ID(field_tr_house),
	};
	if(overlay_idx >= SCR_OVERLAY_ID_MAX){
		return 0;
	}
	if(mode == 0){
		Overlay_Load( IdTbl[overlay_idx], OVERLAY_LOAD_NOT_SYNCHRONIZE );
	}else{
		Overlay_UnloadID( IdTbl[overlay_idx] );
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * お母さんの貯金を調べる
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdCompDeposit( VM_MACHINE * core )
{
	u16 * ret	= VMGetWork( core );	// 戻り値
	u32	gold	= VMGetU32( core );		// 金額

	if( PMTelSv_DepositControl(SaveData_GetPMTelSave(core->fsys->savedata),PMTEL_DEPOSIT_GET,0) >= gold ){
		*ret = TRUE;
	}else{
		*ret = FALSE;
	}

	return 0;
}


//============================================================================================
// 通信対戦レギュレーション
//============================================================================================

// カップ名をWORDSETする
static BOOL EvCmdGetRegulationCupName( VM_MACHINE * core )
{
	u16	num = VMGetU16( core );
	WORDSET** wset = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WORDSET );

	COMMREG_GetCupName( core->fsys, *wset, num );

	return 0;
}

// カップ名をWORDSETする（ワーク指定）
static BOOL EvCmdGetRegulationCupNameWork( VM_MACHINE * core )
{
	u16 * num = GetEventWorkAdrs( core->fsys, VMGetU16(core) );
	WORDSET** wset = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WORDSET );

	COMMREG_GetCupName( core->fsys, *wset, *num );

	return 0;
}

// レギュレーション設定
static BOOL EvCmdRegulationSet( VM_MACHINE * core )
{
	u16 * num = GetEventWorkAdrs( core->fsys, VMGetU16(core) );
	COMMREG_RegulationSet( core->fsys, *num );
	return 0;
}

// ルール表示
static BOOL EvCmdRegulationWinPut( VM_MACHINE * core )
{
	GF_BGL_BMPWIN** win = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_GOLDWINDAT );
	u16 * num = GetEventWorkAdrs( core->fsys, VMGetU16(core) );

	*win = EvWin_RegulationWinPut( core->fsys, *num );

	return 0;
}

// ルール非表示
static BOOL EvCmdRegulationWinDel( VM_MACHINE * core )
{
	GF_BGL_BMPWIN** win = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_GOLDWINDAT );
	EvWin_RegulationWinDel( *win );
	return 0;
}


// 参加できるポケモンがそろっているか
static BOOL EvCmdRegulationPokeCheck( VM_MACHINE * core )
{
	u16 * num = GetEventWorkAdrs( core->fsys, VMGetU16(core) );
	u16 * ret = GetEventWorkAdrs( core->fsys, VMGetU16(core) );
	WORDSET** wset = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WORDSET );

	*ret = COMMREG_PokeCheck( core->fsys, *wset, *num );

	return 0;
}


//============================================================================================
// ホウオウ/ルギアフィールドイベントSE読み込み
//============================================================================================
static BOOL EvCmdLoadSeSceneData( VM_MACHINE * core )
{

	Snd_LoadSeByScene( SND_SCENE_SUB_EVENT );

	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	シェイミフォルム戻り
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdSheimiFormRev( VM_MACHINE * core )
{
	SheimiFrmRev_CallEvt(core->fsys->event);
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	セレビィ時渡り
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdTimeLeapEff( VM_MACHINE * core )
{
	FldSerebyEff_CallEvt(core->fsys);
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	波乗り曲再生禁止
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdNamiBGMForbdn( VM_MACHINE * core )
{
	EVENTWORK* ev = SaveData_GetEventWork(core->fsys->savedata);
	SysFlag_SetNamiBGMFbdn( ev );
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	アンノーン飛び回りエフェクト
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdAnnoeneEff( VM_MACHINE * core )
{
	FldArceusEff_CallAnnoneEvt(core->fsys);
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	アルセウス発光体エフェクト
 *
 * @param	none
 *
 * @retval	1
 */
//--------------------------------------------------------------
static BOOL EvCmdFlashBallEff( VM_MACHINE * core )
{
	u8 type = VMGetU8(core);

	FldArceusEff_CallFlashBallEvt(core->fsys, type);
	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	シント遺跡ギミック初期化
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdInitArceusGmk( VM_MACHINE * core )
{
	ArceusGmk_Init(core->fsys);
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	シント遺跡ギミック非表示
 *
 * @param	none
 *
 * @retval	0
 */
//--------------------------------------------------------------
static BOOL EvCmdVanishArceusGmk( VM_MACHINE * core )
{
	ArceusGmk_Vanish(core->fsys);
	return 0;
}

//--------------------------------------------------------------
/**
 * @brief	シント遺跡ギミックアニメ変更
 *
 * @param	none
 *
 * @retval	1			内部でイベントコールするので1を返す
 */
//--------------------------------------------------------------
static BOOL EvCmdChgArceusGmkAnm( VM_MACHINE * core )
{
	u8 type = VMGetU8(core); //0〜3
	ArceusGmk_ChgAnmMode(core->fsys, type);
	return 1;
}


//--------------------------------------------------------------------------------------------
/**
 * @brief	サファリデータ転送
 * @param
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdSafari_DataTrans( VM_MACHINE * core )
{
    EventCmd_SafariTransData(core->fsys);
    return 1;	//イベントコールしたので、1をリターン
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	サファリデータの人の名前をワードセットする
 * @param
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdGetSafariNameWork( VM_MACHINE * core )
{
	u16 * num = GetEventWorkAdrs( core->fsys, VMGetU16(core) );
	WORDSET** wset = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_WORDSET );
	MYSTATUS* pMyStatus = MyStatus_AllocWork(HEAPID_FIELD);

	SafariSv_GetFriendStatus(SaveData_GetSafariSave(core->fsys->savedata) , pMyStatus);
	WORDSET_RegisterPlayerName(*wset, *num, pMyStatus);
	sys_FreeMemoryEz( pMyStatus );

	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		サファリデータに有効な物が入っているかどうか
                さらに24時間制限を確認してサファリデータを消す
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdIsSafariDataAndDelete( VM_MACHINE * core )
{
	u16 *ret;
	SAFARI_SAVE* pSafari = SaveData_GetSafariSave(core->fsys->savedata);
	ret = VMGetWork( core );
	SafariSv_CheckManagerData( pSafari );
	if ( SafariSv_IsEnableData( pSafari ) ){
		*ret = 1;
	}else{
		*ret = 0;
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		連れ歩きが隣接しているか？
 * @param		core
 *
 * @li	ANSWK = 0 : 隣接してない
 * @li	ANSWK = 1 : 隣接してる

 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdPairPoke_IsNeghbor( VM_MACHINE * core )
{
	u16 * ans = VMGetWork( core );
	//アンサーワークに格納
	if ( PairPoke_IsNeighbor(core->fsys) ){
		*ans = 1;
	}else{
		*ans = 0;
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		アクセサリーくじ引き：アクセサリーコンプしてる？
 * @param		core
 *
 * @li	ANSWK = TRUE	 いっぱい
 * @li	ANSWK = FALSE	よゆう

 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdAcceGameChkComp( VM_MACHINE * core )
{
	u16 * ans = VMGetWork( core );

	if ( AcceGame_ChkComp(core->fsys->savedata) == TRUE ){
		*ans = 1;
	}else{
		*ans = 0;
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		アクセサリーくじ引き：アクセサリーナンバー取得
 * @param		core
 *
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdAcceGameGetAcceNo( VM_MACHINE * core )
{
	u16 * no = VMGetWork( core );
	*no = AcceGame_GetAcceNo();
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		アクセサリーくじ引き：BGコンプしてる？
 * @param		core
 *
 * @li	ANSWK = TRUE	コンプ
 * @li	ANSWK = FALSE	まだ

 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdAcceGameChkImcBgComp( VM_MACHINE * core )
{
	u16 * ans = VMGetWork( core );

	if ( AcceGame_ChkImcBgComp(core->fsys->savedata) == TRUE ){
		*ans = 1;
	}else{
		*ans = 0;
	}
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief		アクセサリーくじ引き：まだ持っていないイメージクリップ壁紙ナンバーをランダムで返す
 * @param		core
 *

 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdAcceGameGetImcBgNoRnd( VM_MACHINE * core )
{
	u16 * no = VMGetWork( core );
	*no = AcceGame_GetImcBgNoRnd(core->fsys->savedata);
	return 0;
}





//--------------------------------------------------------------------------------------------
/**
 * @brief		配信レギュレーションをもっているかどうか
 * @param		core
 */
//--------------------------------------------------------------------------------------------
static BOOL EvCmdMysteryRegulationCheck( VM_MACHINE * core )
{
	u16 * no = VMGetWork( core );
	REGULATION* pReg = SaveData_GetRegulation(core->fsys->savedata,0);

	if(pReg){
		*no = TRUE;
	}
	else{
		*no = FALSE;
	}
	return 0;
}
